【问题标题】:IOC across visual studio projects?跨视觉工作室项目的 IOC?
【发布时间】:2011-04-04 11:58:38
【问题描述】:

我正在尝试将 IOC 和 DI 改造(我知道这是个坏主意,但迟到总比没有好)到现有解决方案中。

代码库由大约 30 个项目组成,每个项目中都有类,这些类对外界几乎没有可见性。作为对 IOC 的相对较新的东西,我在重新编写代码时尝试使用最佳实践,并且似乎最好不要传递 IOC 容器或使其成为静态,因此我试图通过构造函数注入来完成所有事情。

但是,我的问题来了,我不得不跨项目公开大量的类(即物理 .csproj 文件)。我必须这样做是因为我的“配置模块”(我正在使用 Ninject,但这是一个与 IOC 无关的问题)需要了解任何项目中任何类中的所有内容,以便能够解决依赖关系。

我错过了什么重要的事情吗?如果我的所有类都基于接口,它们都应该是公共的吗?我可以以某种方式为我的每个 csproj 边界创建一个 IOC 容器并让它为我注入吗?

【问题讨论】:

    标签: dependency-injection ioc-container


    【解决方案1】:

    我相信你在正确的轨道上。一般来说,任何 IoC 容器都需要了解 (a) 接口和 (b) 实现,以便将所有内容连接起来。您通常在更高级别的模块中进行“接线”(在这种情况下是您的配置模块项目);较低级别的模块不需要了解接口的所有可能实现。为了实现这一点(并促进可测试性),实现需要公开。

    如果您真的愿意,可以使用 InternalsVisibleTo,但我不会。如果您不使用 IoC,则无论如何都需要公开这些类。

    您也可以查看MEF;显然是it allows the implementations to be private or internal

    【讨论】:

      【解决方案2】:

      难道你不能在每个项目中编写一个配置模块,并且只公开它吗?然后使用所有模块而不是单个模块配置 ninject...

      【讨论】:

      • 优点:封装。缺点:现在每个模块都依赖于 Ninject;配置可能更严格(如果消费者 A 希望 IFoo 由 Bar 实现而不是 Foo 怎么办?);没有一个地方可以看到所有的映射。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 2014-12-23
      • 2012-02-24
      • 1970-01-01
      相关资源
      最近更新 更多