我目前正在开发一个项目,它将主要基于图书馆。
我希望使用依赖项注入来使用该库,但我希望该库在很大程度上与所使用的容器无关。
我不久前写了一个“桥”库来使这类事情变得更容易,但我不确定这是否真的是正确的方法? (图书馆:https://github.com/clintkpearson/IoCBridge https://github.com/clintkpearson/IoCBridge)
我不想直接从我的库中引用 DI 技术(Ninject、Windsor 等),因为这样会让使用它的人变得不灵活。
还有其他一些类似的问题,但似乎没有一个问题能够真正令人满意地解决问题。
作为旁注:我意识到我可以确保库遵循一般习惯用法并使用接口和 ctor 参数作为依赖项,然后将其留给使用应用程序来注册容器中的类型。
我能看到的唯一问题(如果我错了,请纠正我)是,这需要消费应用程序实际上know哪些类型链接到哪些接口,是否需要将某些类型注册为单例等等……从即插即用的使用角度来看,这是相当糟糕的。
有点有争议的 http://lostechies.com/chadmyers/2009/07/14/just-say-no-to-poor-man-s-dependency-injection/但我建议使用穷人注射液。我并不是说它很棒,但它在某些限制下有一些有效的用例(就像服务定位器)。它需要更多的维护,但它可以让您免于依赖另一个库来进行 IoC 容器注册。你应该阅读马克·西曼的文章 http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer/就此主题而言。
我最近在一个非常简单的库 https://github.com/uhaciogullari/SimpleMvcSitemap我的。基本上,您为库的公共类编写两个构造函数。
internal SitemapProvider(IActionResultFactory actionResultFactory, IBaseUrlProvider baseUrlProvider)
{
_actionResultFactory = actionResultFactory;
_baseUrlProvider = baseUrlProvider;
}
public SitemapProvider() : this(new ActionResultFactory(), new BaseUrlProvider()) { }
正如您所看到的,只有第二个构造函数是公共的,您自己填充依赖项。这也提供了组装级别的封装。您仍然可以通过添加一个来测试这个类内部可见 http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute%28v=vs.110%29.aspx属性到程序集并在库中自由使用依赖项注入。用户还可以使用 new 关键字创建实例或将此类的接口添加到其 IoC 注册中。
我不知道.NET中是否有广泛采用的IoC容器注册库。我想过自己写一个,但每个容器都有其独特的功能,并且对象生命周期变得更加复杂。人们也会因为依赖另一个图书馆而感到不安。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)