我一直在寻找一些Ruby依赖注入库.特别是,我检查了 Needle和Copland.他们已经存在了很长一段时间,但并没有很多用法.
使用这两个库有哪些优点和缺点?看起来好像很多库/框架都可以很好地利用这两个库,例如Merb/Datamapper的Hook.
编写Copland和Needle的Jamis Buck 在这里发布了有关Needle,依赖注入以及它们在Ruby世界中的用处的信息.
它很长但值得一读,但如果您想要与您的问题最相关的单个段落,我会在结束之前建议这一段:
DI框架是不必要的.在更严格的环境中,它们具有价值.在像Ruby这样的敏捷环境中,并非如此.模式本身可能仍然适用,但要注意陷入认为需要一个特殊工具的陷阱.Ruby是Play-Doh,请记住!让我们保持这种方式.
HTH
http://fabiokung.com/2010/05/06/ruby-and-dependency-injection-in-a-dynamic-world/:这是另一篇比詹姆斯巴克文章更少见解的文章.底线是你不需要依赖注入,因为ruby提供了很多很好的替代方案,它们同样有效,并且在Java世界中并不存在.
其中一个替代方案是mixins,这是Java没有的东西,另一个是能够覆盖/重新定义语言中的任何东西.其他功能包括动态类型,基本上你可以向任何对象发送任何消息,如果碰巧提供了该消息的实现,事情就可以了.所有这些共同努力消除了对DI框架的大量需求.这样的设计模式在Ruby中仍然有效,有时使用它也是有意义的.
Alexey Petrushin上面提到的另一个关于DI的观点是,依赖注入主要是一种设计模式,并且工具是次要的,主要是关于摆脱Java中某些事物的乏味.在ruby中,你可以通过Java轻松模仿spring或guice为你做的大部分事情.因此,完整的依赖注入框架在Ruby中基本上是多余的.
话虽这么说,有时候有一个DI框架是很好的,因为最终它可以带走一些繁琐的布线东西.我不能保证任何Ruby特定的DI框架,但我知道很多Ruby项目最终用另一种语言(Java甚至)重写,因为事物的性质使得事情变得难以维护/扩展.我怀疑这与开发人员用各种强大的语言功能在脚下拍摄有很大关系.有一个DI框架强加了一些结构和习惯用语可能有助于防止这种情况.