【发布时间】:2013-08-26 23:10:41
【问题描述】:
问题
我有一些问题要理解在我的代码中何时何地应该使用像 Ninject 这样的依赖注入器。
代码
假设我们有以下代码:
//WITHOUT NINJECT:
IMailSender mailSender = new MockMailSender();
//WITH NINJECT:
IMailSender mailSender = kernel.Get<IMailSender>();
这不是依赖注入,那么在这种情况下使用 Ninject 有意义吗?
另一个例子展示了我的代码是如何被依赖注入器弄得一团糟的:
public void CalculateRevenueRecognitions(IContract contract)
{
//WITH NINJECT
var kernel = new StandardKernel(new DefaultModule());
var arguments = new List<IParameter>
{
new ConstructorArgument("amount",contract.Revenue),
new ConstructorArgument("date", contract.WhenSigned)
};
contract.AddRevenueRecognition(kernel.Get<IRevenueRecognition>(arguments.ToArray()));
//WITHOUT NINJECT:
contract.AddRevenueRecognition(new RevenueRecognition(contract.Revenue, contract.WhenSigned))));
}
问题
什么时候应该使用依赖注入器?
- 关于构造函数注入、参数注入等
- 关于对象创建(依赖注入器是否将经典对象创建替换为新对象?)
- 是其他人吗?
什么时候不应该使用依赖注入器?
【问题讨论】:
-
在使用 Ninject 参与一个项目并获得一些基本的熟悉之后,测试对我来说变得容易多了。开始使用用例非常困难,您的示例代码不应该使用它。我认为它更多是因为您有一个要使用的查询类,该查询类取决于依赖于设置类的数据库类等。您在 ninject 模块中定义这些绑定,然后请求一个查询对象,然后为您注入其他依赖类。
-
它绝对适用于这段代码,正如我在下面提到的,它配置在错误的地方。大多数依赖关系可以在应用程序启动时解决。
-
在业务对象方法中使用 kernel.Get 对我来说似乎不合适。我对ninject还是新手,所以我想我错了。到目前为止,我只需要使用构造函数注入。
-
我不明白。今天,互联网上的每个人都在写有关 IoC 框架的文章。这不应该是一个容易回答的问题吗?是否有任何规则何时使用它以及何时不应该使用它。我有点迷路了......
-
我只在我觉得需要它的时候,或者当我的老板强迫我时,才在我的工具集中添加一个工具:-)。恕我直言,如果你真的不知道它能给你带来什么好处,你不应该使用它。
标签: c# dependency-injection dependencies inversion-of-control ninject