编辑2015:时间已经过去了,我现在意识到这整件事是一个巨大的错误。IoC容器非常糟糕,DI是处理副作用的非常糟糕的方法。实际上,这里的所有答案(以及问题本身)都是要避免的。只需注意副作用,将它们从纯代码中分离出来,其他一切要么就会就位,要么就会变得无关紧要和不必要的复杂性。
原答覆如下:
我不得不面对同样的决定SolrNet..我一开始的目标是对DI友好和容器无关,但是随着我添加了越来越多的内部组件,内部工厂很快变得无法管理,由此产生的库变得不灵活。
最后我写了我自己的非常简单的嵌入式IoC容器同时也提供了一个温莎设施和一个尼尼姆模块..将库与其他容器集成只是一个正确连接组件的问题,所以我可以轻松地将它与Autofac、Unitity、StructurereMap等集成在一起。
缺点是我失去了new
提高服务水平。我还依赖于CommonServiceLocator我本可以避免的(我可能会在将来重构它),以使嵌入式容器更易于实现。
这里有更多的细节。博客帖子.
质检似乎依赖类似的东西。它有一个IObjectBuilder接口,它实际上是CommonServiceLocator的IServiceLocator,有几个方法,然后它为每个容器实现这一点,即NInjectObjectBuilder和一个常规的模块/设施,即质数传递模..然后它依赖于IObjectBuilder实例化它需要的东西。当然,这是一种有效的方法,但就我个人而言,我不太喜欢它,因为它实际上是在容器周围传递太多,使用它作为服务定位器。
单轨实施器它自己的容器同时,它也实现了好的IServiceProvider..此容器在整个框架中使用,通过公开知名服务的接口。..要获得混凝土容器,它有一个内置服务提供者定位器..这个温莎设施将此服务提供者定位器指向Windsor,使其成为所选的服务提供者。
底线:没有完美的解决方案。与任何设计决策一样,这个问题需要在灵活性、可维护性和便利性之间取得平衡。