为了账号安全,请及时绑定邮箱和手机立即绑定

依赖注入(DI)“友好”库

依赖注入(DI)“友好”库

白板的微信 2019-06-13 17:02:13
依赖注入(DI)“友好”库我正在考虑C#库的设计,它将具有几种不同的高级功能。当然,这些高级函数将使用实心类设计原则越多越好。因此,可能会有供消费者定期直接使用的类,以及那些更常见的“最终用户”类的依赖关系的“支持类”。问题是,设计库的最佳方法是:DI不可知论-虽然添加基本的“支持”一两个常用的DI库(结构地图、尼尼微等)似乎是合理的,但我希望消费者能够使用任何DI框架的库。不可用的-如果库的使用者没有使用DI,那么库仍然应该尽可能容易使用,从而减少用户创建所有这些“不重要”的依赖关系所需的工作量,这仅仅是为了获得他们想要使用的“真实”类。我目前的想法是为常见的DI库提供一些“DI注册模块”(例如,一个StructurereMap注册表,一个Ninject模块),以及一个非DI并包含到这几个工厂的耦合的Set或Factory类。思想?
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

编辑2015:时间已经过去了,我现在意识到这整件事是一个巨大的错误。IoC容器非常糟糕,DI是处理副作用的非常糟糕的方法。实际上,这里的所有答案(以及问题本身)都是要避免的。只需注意副作用,将它们从纯代码中分离出来,其他一切要么就会就位,要么就会变得无关紧要和不必要的复杂性。

原答覆如下:


我不得不面对同样的决定SolrNet..我一开始的目标是对DI友好和容器无关,但是随着我添加了越来越多的内部组件,内部工厂很快变得无法管理,由此产生的库变得不灵活。

最后我写了我自己的非常简单的嵌入式IoC容器同时也提供了一个温莎设施和一个尼尼姆模块..将库与其他容器集成只是一个正确连接组件的问题,所以我可以轻松地将它与Autofac、Unitity、StructurereMap等集成在一起。

缺点是我失去了new提高服务水平。我还依赖于CommonServiceLocator我本可以避免的(我可能会在将来重构它),以使嵌入式容器更易于实现。

这里有更多的细节。博客帖子.

质检似乎依赖类似的东西。它有一个IObjectBuilder接口,它实际上是CommonServiceLocator的IServiceLocator,有几个方法,然后它为每个容器实现这一点,即NInjectObjectBuilder和一个常规的模块/设施,即质数传递模..然后它依赖于IObjectBuilder实例化它需要的东西。当然,这是一种有效的方法,但就我个人而言,我不太喜欢它,因为它实际上是在容器周围传递太多,使用它作为服务定位器。

单轨实施器它自己的容器同时,它也实现了好的IServiceProvider..此容器在整个框架中使用,通过公开知名服务的接口。..要获得混凝土容器,它有一个内置服务提供者定位器..这个温莎设施将此服务提供者定位器指向Windsor,使其成为所选的服务提供者。

底线:没有完美的解决方案。与任何设计决策一样,这个问题需要在灵活性、可维护性和便利性之间取得平衡。


查看完整回答
反对 回复 2019-06-13
  • 3 回答
  • 0 关注
  • 492 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信