我明白dependency injection本身的好处。 以Spring为例。 我也了解像AOP这样的其他Spring特性的好处,不同types的帮助器等。我只是想知道XMLconfiguration的好处,例如: <bean id="Mary" class="foo.bar.Female"> <property name="age" value="23"/> </bean> <bean id="John" class="foo.bar.Male"> <property name="girlfriend" ref="Mary"/> </bean> 比较普通的老式java代码如: Female mary = new Female(); mary.setAge(23); Male john = new Male(); john.setGirlfriend(mary); 这是更容易debugging,编译时间检查,可以被任何人只知道Java的理解。 那么dependency injection框架的主要目的是什么呢? (或者显示其好处的一段代码)。 更新: 的情况下 IService myService;// … public void doSomething() { myService.fetchData(); } 如果有多个IoC框架,我怎么能猜测我想要注入myService的哪个实现? 如果给定的接口只有一个实现,并且让IoC容器自动决定使用它,那么在第二个实现出现之后它将被中断。 如果有意识地只有一个可能的接口实现,那么你不需要注入它。 看到IoC的一小部分configuration将会非常有趣,它显示了它的优点。 我一直在使用Spring,我不能提供这样的例子。 我可以展示单行显示hibernate,dwr和我使用的其他框架的好处。 更新2: 我意识到IoCconfiguration可以在不重新编译的情况下进行更改。 这真的是个好主意吗? […]
我写了一个组件,给定一个ZIP文件,需要: 解压该文件。 在解压缩的文件中find一个特定的dll。 通过reflection加载该dll并调用其上的一个方法。 我想unit testing这个组件。 我很想编写直接处理文件系统的代码: void DoIt() { Zip.Unzip(theZipFile, "C:\\foo\\Unzipped"); System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar"); myDll.InvokeSomeSpecialMethod(); } 但人们经常说:“不要编写依赖文件系统,数据库,networking等的unit testing” 如果我以unit testing友好的方式写这个,我想这应该是这样的: void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner) { string path = zipper.Unzip(theZipFile); IFakeFile file = fileSystem.Open(path); runner.Run(file); } 好极了! 现在是可testing的; 我可以喂testing双打(嘲笑)的DoIt方法。 但费用是多less? 我现在不得不定义3个新的接口来做这个testing。 我究竟在testing什么? 我正在testing我的DoIt函数是否正确地与它的依赖进行交互。 它不testingzip文件是否正确解压缩等。 它不觉得我正在testingfunction了。 感觉就像我只是在testing课堂互动。 我的问题是 :什么是正确的方式来unit testing依赖于文件系统的东西? 编辑我正在使用.NET,但是这个概念也可以应用Java或本地代码。
如果我理解正确,dependency injection的典型机制是通过类的构造函数或通过类的公共属性(成员)注入。 这暴露了被注入的依赖关系,违反了封装的OOP原则。 我是否正确地认定这个权衡? 你如何处理这个问题? 请看下面我自己的问题的答案。
我一直在阅读有关Unity(dependency injection,控制反转)的MSDN上的文章,但我想我需要用简单的术语(或简单的例子)来解释它。 我熟悉MVPC模式(我们在这里使用它),但是我还不能真正掌握这个Unity的东西,而且我认为这是我们应用程序devise的下一步。
我是一个很长时间的Windows开发者,在win32和早期的COM上已经断绝了我的牙齿。 自2001年以来,我一直在使用.Net,所以我非常stream利地使用C#和CLR。 我从来没有听说过温莎城堡,直到我开始参与堆栈溢出。 我已阅读温莎城堡“入门指南”,但不是点击。 教这个老狗新花样,告诉我为什么我应该把温莎城堡整合到我的企业应用程序中。
在Java中, IoC / DI是一种非常普遍的做法,广泛用于Web应用程序,几乎所有可用的框架和Java EE。 另一方面,也有很多大的Python Web应用程序,但除了Zope(我听说应该是非常糟糕的代码)之外,IoC在Python世界中似乎并不常见。 (如果你认为我错了,请列举一些例子)。 当然有几个stream行的Java IoC框架的克隆可用于Python,例如springpython 。 但是他们似乎都没有被实际使用。 至less,我从来没有在Django或sqlalchemy + <insert your favorite wsgi toolkit here>基于Web的应用程序,它使用类似的东西。 在我看来,IoC具有合理的优势,例如可以很容易地replacedjango-default-user-model,但Python中接口类和IoC的广泛使用看起来有点奇怪,而不是pythonic。 但也许有人有一个更好的解释,为什么IoC没有广泛使用Python。
这两种模式似乎都是控制反转原理的实现。 也就是说,一个对象不应该知道如何构build它的依赖关系。 dependency injection(DI)似乎使用构造函数或setter来“注入”它的依赖关系。 使用构造函数注入的示例: //Foo Needs an IBar public class Foo { private IBar bar; public Foo(IBar bar) { this.bar = bar; } //… } 服务定位器似乎使用一个“容器”,它连接它的依赖关系,并给出它的条形码。 使用服务定位器的示例: //Foo Needs an IBar public class Foo { private IBar bar; public Foo() { this.bar = Container.Get<IBar>(); } //… } 因为我们的依赖关系本身就是对象,所以这些依赖关系具有依赖关系,依赖关系更多,依此类推。 因此,控制容器的倒置(或称DI容器)诞生了。 例如:温莎城堡,Ninject,结构图,spring等) 但IOC / DI容器看起来完全像服务定位器。 称之为DI容器是一个坏名字? […]
我试图在工作中引入DI作为模式,我们的一位开发人员想知道:使用dependency injection模式有什么缺点 ? 注意我在这里寻找一个 – 如果可能的话 – 详尽的列表,而不是主题上的主观讨论。 澄清 :我正在谈论dependency injection模式 (请参阅Martin Fowler的本文 ), 而不是基于XML(如Spring)或基于代码(如Guice)或“自动滚动” 。 编辑 :在这里进行一些伟大的进一步讨论/咆哮/辩论/ r /编程 。
问题是,Azure WebJobs SDK只支持公共静态方法作为入口点,这意味着没有办法实现构造函数/属性注入。 我无法在官方WebJobs SDK文档/资源中find有关此主题的任何内容。 我遇到的唯一解决scheme是基于这篇文章中描述的服务定位器(反)模式。 有没有一种很好的方法来使用基于Azure WebJobs SDK的项目的“适当的”依赖项注入?
据博客和微软自己说,MEF不是另一个IoC容器。 好的…但是为什么? 对我来说似乎也是一样。 也许它不如Unity或Castle Windsor ,但它仍然符合定义,不是吗? 为什么MEF不是像Unity或Castle Windsor这样的IoC容器?