DDD和依赖注入

时间:2014-03-03 16:04:22

标签: c# design-patterns dependency-injection domain-driven-design ninject

我目前正试图将DDD模式与依赖注入“结合”(使用Ninject),但我觉得我这样做违反了基本原则。

我有一个控制台应用程序,它在OWIN之上托管NancyFX Web框架以提供配置界面。我的项目结构如下:

Infrastructure
    - Infrastructure.Core
        - Repositories
        - Mappings
    - Infrastructure.Media
        - Media Services

Core
    - Logging & Exception-Handling intercaces

Domain
    - Entities
    - Repositories
    - Services

App
    - Main application

Web
    - Web Frontend (Nancy Modules, Models etc.)

因为我在所有地方DIying(嘿......)(将上下文注入存储库,解析单例服务......),我在 App 项目中创建了一个静态类这将创建一个IKernel实例并在应用程序启动时注册所有依赖项。

我有一些将在Nancy Modules和自托管Web API控制器中访问的存储库,现在我遇到的第一个问题是当我想在'per request'生命周期中注册存储库时:IKernel.Bind( ).PerRequest()仅在Ninject.Web.Common包中可用,它依赖于Microsoft.Web.Infrastructure等等。我最终在组件中创建对特定于Web的包的依赖关系,基本上对我一无所知Web框架或API(配置OWIN除外)。

此外,通过绑定域名存储库&服务接口来自基础设施层的具体实现,我根据实现做了我的应用程序,这感觉并不是真的。

我怎样才能解决这些问题?

1 个答案:

答案 0 :(得分:2)

您听说过Composition Root吗?您只能在最顶层的项目(例如Web应用程序)中将内容注册到特定实现。你在其他任何地方对接口进行编码。

听起来你已经自己发明了这个并且我不能真正感受到这个问题 - 因为这是引用所有内容的最顶级项目,包括web,owins,ninjects等,这里真的应该没有问题。

我的建议是永远不要使用单身人士。相反,有工厂或本地依赖性解析器。解析器是本地基础结构的一部分,用作在隔离子系统中创建服务的中心。解析器可以安全地被其周围环境使用,它没有引用任何东西,但它有一个可配置的提供程序,它再次在Composition Root中设置。

这样,如果解析器使用特定的实现甚至是特定的DI容器,那么它就会在最顶层的项目中设置。

相关问题