我应该在哪里为 DDD 中的域基础设施服务配置我的 DI 容器?
Where should I configure my DI container for domain infrastructure services in DDD?
我想弄清楚为我的域存储库服务配置依赖项注入容器的代码所在的位置。
我最初的想法是让客户端配置所有服务,但后来客户端需要知道存储库服务,我不想在客户端公开它。
我在想每一层都可以通过暴露的配置方式配置自己的服务依赖或者class?
答案已经在评论中给出了,我只是在这里总结一下正确的答案。
除非您使用插件架构等特殊用途的架构,您应该始终在一个地方配置 DI 容器,尽可能靠近应用程序入口点。这称为合成根。
配置的类型是存储库、工厂、域服务还是应用程序服务都没有关系。所有 DI 配置都应放在 一个 位置。
请参阅 this blog post 了解有关合成根的详细介绍。
My initial thought was to let the client configure all services, but
then the client needs to be aware of the repository service, which I
don't want to expose in the client.
我倾向于做的仍然是遵循 Composition Root 模式,我的 web 项目将是 IoC 连接开始的第一个地方(即通常的第 3 方库将自己挂接到控制器工厂)。但是我随后通过引用一个 IoC 模块来配置其余的 IoC 绑定(在我的例子中,我通常使用 Ninject,所以我从我的 Web 项目中引用了一个 NinjectModule
)。但是我把这个 NinjectModule
放在一个单独的基础设施项目中。
然后我可以从我的 Web 项目中引用这个 IoC 基础结构项目,并且 IoC 项目可以引用解决方案中的所有其他项目。
这样我就不必在我的 Web 项目中创建项目引用来引用我可能不希望我的 Web 项目访问的内容,例如我的存储库层。
我想弄清楚为我的域存储库服务配置依赖项注入容器的代码所在的位置。
我最初的想法是让客户端配置所有服务,但后来客户端需要知道存储库服务,我不想在客户端公开它。
我在想每一层都可以通过暴露的配置方式配置自己的服务依赖或者class?
答案已经在评论中给出了,我只是在这里总结一下正确的答案。
除非您使用插件架构等特殊用途的架构,您应该始终在一个地方配置 DI 容器,尽可能靠近应用程序入口点。这称为合成根。
配置的类型是存储库、工厂、域服务还是应用程序服务都没有关系。所有 DI 配置都应放在 一个 位置。
请参阅 this blog post 了解有关合成根的详细介绍。
My initial thought was to let the client configure all services, but then the client needs to be aware of the repository service, which I don't want to expose in the client.
我倾向于做的仍然是遵循 Composition Root 模式,我的 web 项目将是 IoC 连接开始的第一个地方(即通常的第 3 方库将自己挂接到控制器工厂)。但是我随后通过引用一个 IoC 模块来配置其余的 IoC 绑定(在我的例子中,我通常使用 Ninject,所以我从我的 Web 项目中引用了一个 NinjectModule
)。但是我把这个 NinjectModule
放在一个单独的基础设施项目中。
然后我可以从我的 Web 项目中引用这个 IoC 基础结构项目,并且 IoC 项目可以引用解决方案中的所有其他项目。
这样我就不必在我的 Web 项目中创建项目引用来引用我可能不希望我的 Web 项目访问的内容,例如我的存储库层。