【问题标题】:Where should I configure my DI container for domain infrastructure services in DDD?我应该在哪里为 DDD 中的域基础架构服务配置我的 DI 容器?
【发布时间】:2016-08-06 19:48:09
【问题描述】:

我正在尝试确定为我的域存储库服务配置依赖注入容器的代码所在的位置。

我最初的想法是让客户端配置所有服务,但随后客户端需要知道存储库服务,我不想在客户端中公开它。

我在想每一层都可以通过暴露的配置方法或类来配置自己的服务依赖关系?

【问题讨论】:

  • 我总是在应用层之上创建具有所有 DI 配置的特定层。多亏了这一点,我不需要为所有 UI(rest、cli、soap 等)重复 DI 配置层。如果您使用六边形架构,则有点不同,那么它应该位于基础架构层中。
  • "域存储库服务" ? ...
  • 您通常希望在应用程序入口点blog.ploeh.dk/2011/07/28/CompositionRoot配置所有DI
  • @guillaume31 我只是指我注入到我的域服务中的存储库。
  • 当我需要在组合根目录中配置不可用的依赖项(被访问修饰符隐藏)时,它是如何工作的。

标签: dependency-injection domain-driven-design ddd-repositories


【解决方案1】:

我最初的想法是让客户端配置所有服务,但是 那么客户端需要知道存储库服务,我 不想在客户端暴露。

我倾向于做的仍然是遵循组合根模式,我的 Web 项目将是 IoC 连接开始的第一个地方(即通常的第 3 方库类型,它将自身连接到控制器工厂)。但是我随后通过引用 IoC 模块来配置其余的 IoC 绑定(在我的情况下,我通常使用 Ninject,因此我从我的 Web 项目中引用了 NinjectModule)。但我把这个NinjectModule 放在了一个单独的基础设施项目中。

然后我可以从我的 Web 项目中引用这个 IoC 基础设施项目,并且该 IoC 项目可以引用解决方案中的所有其他项目。

这样我就不必在我的 Web 项目中创建项目引用来引用我可能不希望我的 Web 项目访问的东西,例如我的存储库层。

【讨论】:

    【解决方案2】:

    答案已经在 cmets 中给出了,我只是在这里总结一下。

    除非您使用插件架构等特殊用途的架构,您应该始终将 DI 容器配置在一个位置,尽可能靠近应用程序入口点。这称为组合根。

    配置的类型是存储库、工厂、域服务还是应用程序服务都没有关系。所有 DI 配置都应该放在 一个 的地方。

    请参阅this blog post,了解有关组合根的详细信息。

    【讨论】:

    • 当我需要在组合根目录中配置不可用的依赖项(被访问修饰符隐藏)时,它是如何工作的。
    • 通过将其隐藏在组合根目录中。要么通过访问修饰符访问它(首选),要么在 .NET 中使用像 InternalsVisibleTo 这样的机制(我建议不要这样做,但它是一个选项)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2017-01-29
    • 2010-10-16
    • 2016-07-12
    • 2011-11-28
    • 2020-05-31
    相关资源
    最近更新 更多