Dependency injection 我应该在哪里为DDD中的域基础设施服务配置DI容器?

Dependency injection 我应该在哪里为DDD中的域基础设施服务配置DI容器?,dependency-injection,domain-driven-design,ddd-repositories,Dependency Injection,Domain Driven Design,Ddd Repositories,我试图找出为我的域存储库服务配置依赖项注入容器的代码所在的位置 我最初的想法是让客户机配置所有服务,但是客户机需要知道存储库服务,我不想在客户机中公开它 我认为每一层都可以通过一个公开的配置方法或类来配置自己的服务依赖关系?答案已经在评论中给出了,我只是在这里给出了一个正确的答案 除非您使用特殊用途的体系结构,如插件体系结构,您应该始终在单个位置配置DI容器,尽可能靠近应用程序入口点。这称为合成根。 配置的类型是存储库、工厂、域服务还是应用程序服务并不重要。所有DI配置都应该放在一个地方 有关合

我试图找出为我的域存储库服务配置依赖项注入容器的代码所在的位置

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

我认为每一层都可以通过一个公开的配置方法或类来配置自己的服务依赖关系?

答案已经在评论中给出了,我只是在这里给出了一个正确的答案

除非您使用特殊用途的体系结构,如插件体系结构,您应该始终在单个位置配置DI容器,尽可能靠近应用程序入口点。这称为合成根。

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

有关合成根的详细信息,请参阅。

答案已经在评论中给出,我只是在这里用一个适当的答案来结束它

除非您使用特殊用途的体系结构,如插件体系结构,您应该始终在单个位置配置DI容器,尽可能靠近应用程序入口点。这称为合成根。

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

有关合成根的详细信息,请参见

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

我倾向于遵循组合根模式,在这里,我的web项目将是IoC布线的第一个开始(即通常的第三方库,它将自己连接到控制器工厂)。但是我随后通过引用一个IoC模块来配置其余的IoC绑定(在我的例子中,我通常使用Ninject,因此我从我的web项目中引用一个
NinjectModule
)。但是我把这个
NinjectModule
放在一个单独的基础设施项目中

然后,我可以从我的web项目中引用这个IoC基础设施项目,IoC项目可以引用解决方案中的每个其他项目

这样,我就不必在web项目中创建项目引用,以引用我可能不希望web项目访问的内容,例如我的存储库层

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

我倾向于遵循组合根模式,在这里,我的web项目将是IoC布线的第一个开始(即通常的第三方库,它将自己连接到控制器工厂)。但是我随后通过引用一个IoC模块来配置其余的IoC绑定(在我的例子中,我通常使用Ninject,因此我从我的web项目中引用一个
NinjectModule
)。但是我把这个
NinjectModule
放在一个单独的基础设施项目中

然后,我可以从我的web项目中引用这个IoC基础设施项目,IoC项目可以引用解决方案中的每个其他项目


这样,我就不必在我的web项目中创建项目引用来引用我可能不希望web项目访问的内容,比如我的存储库层。

我总是在应用程序层之上创建特定的层,其中包含所有DI配置。由于这一点,我不需要在DI配置的所有UI(rest、cli、soap等)层重复我自己的操作。如果您使用六边形体系结构,那么它应该位于基础结构层中,这有点不同。“域存储库服务”。。。您通常希望在应用程序入口点@guillaume31配置所有DI。我指的是我注入域服务的存储库。当我需要配置不可用的依赖项(由访问修饰符隐藏)时,该如何工作在复合根目录中,我总是在应用层的顶部创建特定层,其中包含所有DI配置。由于这一点,我不需要在DI配置的所有UI(rest、cli、soap等)层重复我自己的操作。如果您使用六边形体系结构,那么它应该位于基础结构层中,这有点不同。“域存储库服务”。。。您通常希望在应用程序入口点@guillaume31配置所有DI。我指的是我注入域服务的存储库。当我需要配置不可用的依赖项(由访问修饰符隐藏)时,该如何工作当我需要配置在组合根目录中不可用的依赖项(由访问修饰符隐藏)时,它是如何工作的。通过不向组合根目录隐藏它。可以通过访问修饰符使其可访问(首选),也可以使用.NET中的InternalsVisibleTo机制(我不建议这样做,但这是一个选项)。当我需要配置组合根中不可用的依赖项(由访问修饰符隐藏)时,这是如何工作的。方法是不将其隐藏在组合根中。要么通过访问修饰符使其可访问(首选),要么在.NET中使用类似InternalsVisibleTo的机制(我建议不要这样做,但这是一个选项)。