dependency injection初始化

请注意:我刚开始使用AutoFac来了解DI和IoC。

dependency injection应该在控制器构造函数中初始化吗?

这怎么样?

private IMyService iMyService; public HomeController(IMyServices myService) { iMyService = myService; } 

不同于…

 public IMyService iMyService = new MyService(); 

最后,似乎依赖性仍然存在。

编辑:修正了拼写错误,新的MyService(); 是新的IMyService();

dependency injection意味着完全注入依赖关系。 它没有说明初始化。 例如,如果您正在注入Singleton的依赖项,那么它可以在您注入它之前很久就被初始化。

您的第一个代码是通过构造函数进行的通常dependency injection 。 你的第二个代码不是dependency injection。 实际上它对我来说看起来很奇怪 – 要么你试图创建接口实例,这是不可能的,或者你在这里命名不好。 如果它只是错误的命名或拼写错误,那么第二个样本应该看起来像:

  public IMyService iMyService = new MyServiceImplementation(); 

但你不是在这里注射任何东西。 您只是创建依赖项实例(这使您的控制器耦合到依赖项实现)。

编辑时,依赖关系总是“存在”,但它被移到了类之外的通知,当MyService在另一个类中时, IMyServices现在可以在与HomeController相同的项目中定义。 并且您的HomeController DLL可以在不知道您的MyService dll有效地解耦它们的情况下进行编译。


这是一个非常复杂的主题,您应该阅读一本关于它的书。 阅读博客video等并没有真正帮助。

这是一本好书。 http://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/dp/1935182501

这是一个伟大的video讲座系列前5个video关于DI一般http://channel9.msdn.com/Blogs/mtaulty/Prism–Silverlight-Part-1-Taking-Sketched-Code-Towards-Unity

启动主要集中在组合根 http://blog.ploeh.dk/2011/07/28/CompositionRoot/

你在这里展示的模式是构造注射

https://softwareengineering.stackexchange.com/questions/177649/what-is-constructor-injection

dependency injection并非易事 – 概念很简单,但理解它可能需要一些实践和研究。 让我举一个使用DI的地方的例子,也许它会有意义(可能不是最好的例子,抱歉我想不出更好的ATM):

所以说你有以下课程:

 public class MyAwesomeClass { private readonly IConfig _config; public MyAwesomeClass(IConfig config) { _config = config; } public IEnumerable GetFiltered() { IEnumerable results = _config.GetSettings(); // filter my results return results.Where(x => x.StartsWith("awesome", StringComparison.OrdinalIgnoreCase)); } } 

现在,如果您要测试GetFiltered您可以注入假的IConfig实现,并确保您的filter正常工作(您代码与depdendencies 隔离 )。 你也可以通过暴露依赖关系并让你的class级用户来处理它们来反转控件 ,你几乎都说 – “如果你想让我工作,我需要你给我一个IConfig的实现,你要小心它。“

以下是测试的外观

 [Test] public void GetsOnlyResultsContainingAwesome() { var fakeConfig = new FakeConfig(); var awesome = new MyAwesomeClass(fakeConfig); IEnumerable results = awesome.GetFiltered(); Assert.AreEqual(2, results.Count()); } 

这是IConfig的虚假实现

 public class FakeConfig : IConfig { public IEnumerable GetSettings() { return new List { "test1", "test2", "awesome1", "awesome2" }; } } 

我希望这是有道理的。 对不起,如果我的例子不好,但我只想说明一点。

你可以这么说吧。 实际上,AutoFac,ninject等具有将接口与类绑定的function。 所以你需要先做到这一点。 我的意思是说你需要创建一个类,你需要让AutoFac和ninject将它与接口绑定。

因此,当控制器将查找任何特定接口时,AutoFac和ninject将只创建该类的对象并将其分配给接口。 就初始化而言,您可以在使用接口绑定类时初始化值。

 private IMyService iMyService; public HomeController(IMyServices myService) { iMyService = myService; } 

在这种情况下,你只关心你需要什么(IMyServices)

 public IMyService iMyService = new MyService(); 

但在这种情况下,你关心它将是什么(新的MyService())

设计课程时,你知道自己需要什么;
但是,那将由你决定,由谁来使用你的课程决定