Dependency injection Unity(等)如何帮助依赖注入

Dependency injection Unity(等)如何帮助依赖注入,dependency-injection,unity-container,Dependency Injection,Unity Container,我对DI容器(特别是Unity)以及它们实际上如何帮助DI有一些疑问 我相信我了解IoC/DI,并且多年来一直在使用基于构造函数的DI。通常,在我使用DI时,它只涉及在我的类上有一个构造函数,比如说MyClassX,它将接口作为参数,比如说IDataService,然后使用新操作符创建IDataService实现类的实例,并将其传递给MyClassX的构造函数。这样,MyClassX就不需要知道它正在使用的IDataService的确切类型,从而将其与特定类型分离。如果我错了,请纠正我,但这就是

我对DI容器(特别是Unity)以及它们实际上如何帮助DI有一些疑问

我相信我了解IoC/DI,并且多年来一直在使用基于构造函数的DI。通常,在我使用DI时,它只涉及在我的类上有一个构造函数,比如说MyClassX,它将接口作为参数,比如说IDataService,然后使用新操作符创建IDataService实现类的实例,并将其传递给MyClassX的构造函数。这样,MyClassX就不需要知道它正在使用的IDataService的确切类型,从而将其与特定类型分离。如果我错了,请纠正我,但这就是我所理解的DI…尽管它不必是基于构造函数的

现在我在网上看到了一堆Unity的例子,但我发现不仅很难理解它所做的一切(对我来说,它似乎是一个神奇的对象工厂),而且很难理解它是如何帮助DI的。在我看来,Unity更像是一个工厂实现(或模拟框架?),而不是专门与DI相关的任何东西。我想我真的错过了一些东西,正在等待一个“啊哈”的时刻。我做了很多谷歌搜索,但例子没有帮助。。。我需要一个理论上的解释


有人能给我解释一下Unity到底是做什么的吗?据我所知,Unity的主要功能以及它与DI的关系。

当对象图很简单时,您可能看不到使用DI容器的明显优势

假设你有一个MyClassX类,它依赖于IExampleA,IExampleB。现在IExampleA和IExampleB的实现可能依赖于其他一些类,等等。现在,这种对象图在具体化/实例化时很难手动处理

这就是DI发挥作用的地方。一旦注册(类及其依赖的类),您需要做的就是

 var myclassX = _container.Resolve<MyClassX>()
var myclassX=\u container.Resolve()

别误会,DI提供的不仅仅是解决依赖关系。例如,管理对象的生活方式和生命周期等。

您对基本依赖注入的理解是正确的。构造函数注入是最常见的模式

其他一些DI Unity会:

  • 生命周期管理–实例创建可以是单例的,每个实例一个 线程和其他高级模型
  • 处理依赖关系图-请求根对象,Unity创建其所有依赖关系 依赖关系
  • 启用方法和属性注入–需要 业务代码中的Unity属性(我更愿意避免)
  • 服务定位器模式–通常被认为是
  • 1和2在你需要的时候很好。我认为#3和#4应该尽可能避免,因为它将代码中的依赖项添加到Unity容器中

    您错过的大爆炸是由启用的。这允许实现交叉关注点。日志记录就是一个典型的例子。如果您想要更多,请开始阅读所有的异常处理、验证等信息,或者只是开始在web上搜索AOP


    当您将依赖项的构造函数注入与横切关注点的外部实现相结合时,您可以非常接近只包含业务逻辑的业务对象。在一个大型企业开发团队中,这是一个巨大的突破。

    我仍然看不到在容器中预先注册所有依赖项的好处…对我来说,使用接口注册具体类型的过程实际上是耦合的…(尽管是在运行时)这正是我要开始做的简单的总结性解释!谢谢仅供参考,我只是试着转到两个日志示例,第一个链接已断开,第二个重定向到似乎已被破坏的页面。。。我现在已经编辑以删除它们。