【问题标题】:How do you handle 'deep' dependencies with IoC and DI?你如何处理 IoC 和 DI 的“深度”依赖关系?
【发布时间】:2011-05-08 13:46:40
【问题描述】:

我是 IoC 的新手,我正在玩 Unity。假设您有一个包含“n”个项目的解决方案,并且您想使用 Unity 来注册和解决依赖项。假设您的组合根在项目 a 中。假设您的解决方案中有以下项目。

一个 b C d

假设 a 依赖于 b 中的某些东西,b 依赖于 c 和 中的某些东西c 依赖于 d

中的某些东西

我已经看到如何使用构造函数注入来解决 a => b 依赖关系,但我对 b's 如何依赖 c 无需访问在项目a中配置和创建的容器即可解决。

解决嵌套依赖的方法是什么? 是否有解决深度依赖关系的讨论/博客/示例?

【问题讨论】:

  • 基于链接的可能重复,如果我在b中并且需要c的实例,我会要求容器解析实例吗?即:C c = container.resolve();如果我在 C 中,我是否遵循相同的模式...这将要求所有项目都可以访问容器...这是一种理想的方法吗?
  • 不,只有您的最高级别项目(应用程序或网站)应该引用容器。较低层甚至不需要知道具体的依赖关系。换句话说,在 C 中,您永远不需要从 D 中解析类的具体实例。这有意义吗?

标签: c# dependency-injection unity-container ioc-container


【解决方案1】:

您的组合根应创建和交付所有依赖项,包括嵌套的依赖项,因此它需要对所有相关程序集的引用(除非您使用反射来提供它们)。

例如,您通常在创建A 之前创建B 的实例(提供其依赖项C)。如果你这样做'by hand',它看起来像这样:

C c = new C();
B b = new B(c);
A a = new A(b);

只要你注册了所有合适的类型,你的依赖注入框架就会为你解析它们。

有关该主题的精彩文章,请参阅 Miško Hevery 的“Dependency Injection Myth: Reference Passing”。

【讨论】:

  • 感谢文章的链接。它几乎描述了我正在努力解决的概念。
  • 不客气 - 当我读到那篇文章时,很多事情都对我有帮助,我很高兴听到它有所帮助。
猜你喜欢
  • 2010-09-15
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2015-05-11
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多