Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DDD和依赖注入_C#_Design Patterns_Dependency Injection_Domain Driven Design_Ninject - Fatal编程技术网

C# DDD和依赖注入

C# DDD和依赖注入,c#,design-patterns,dependency-injection,domain-driven-design,ninject,C#,Design Patterns,Dependency Injection,Domain Driven Design,Ninject,我目前正试图将DDD模式与依赖注入(使用Ninject)结合起来,但我觉得这样做违背了基本原则 我有一个控制台应用程序,它在OWIN之上托管NancyFX web框架,以提供配置界面。我的项目结构如下: Infrastructure - Infrastructure.Core - Repositories - Mappings - Infrastructure.Media - Media Services Core - L

我目前正试图将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.)
由于我正在到处DIY(呵呵…)(将上下文注入存储库,解析单例服务…),我在我的应用程序项目中创建了一个静态类,它创建了一个IKernel实例,并在应用程序启动时注册所有依赖项

我有一些存储库将在Nancy模块和自托管Web API控制器中访问,现在我面临的第一个问题是我想在“每个请求”生命周期中注册存储库:IKernel.Bind().PerRequest()仅在依赖于Microsoft.Web.Infrastructure等的Ninject.Web.Common包中可用。。等我最终在一个基本上对我的web框架或API一无所知的组件中创建了特定于web的包的依赖项(除了配置OWIN)

此外,通过将域存储库和服务接口绑定到基础架构层的具体实现,我使我的应用程序依赖于这些实现,但这并不是真正正确的

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

你听说过吗?您只在最顶层的项目(例如web应用程序)中将内容注册到特定的实现。在其他任何地方,您都可以根据接口编写代码

听起来这是你自己发明的,我真的感觉不到问题所在——因为这是引用所有东西(包括web、owins、Ninject和其他)的最顶级项目,所以这里真的应该没有问题

我的建议是永远不要使用单身。相反,您可以使用工厂或本地依赖项解析程序。解析器是本地基础设施的一部分,充当在隔离子系统中创建服务的中心。解析器可以被周围环境安全地使用,它不引用任何内容,但它有一个可配置的提供程序,该提供程序再次在Composition根目录中设置


这样,如果冲突解决程序使用特定的实现,甚至特定的DI容器,所有这些都将设置在最顶层的项目中。

+1关于“本地冲突解决程序”(也称为抽象工厂)的更多信息:请参考您试图与DI结合的特定DDD模式。有人会说这不是一种模式,但我给你一个机会让你证明它是。@Fuhrmanator我的应用程序只是一个核心的软件转码器。这就是为什么它运行在Windows服务中(而不是作为IIS上的web应用程序),而整个web内容只是用于配置的“表示层”。这就是我想要将web内容从主项目中分离出来的方式。但是,通过将我的repo配置为具有请求生命周期管理器(主要用于http请求),我将使我的应用程序不可避免地依赖于web库,如System.web.Mvc,因为它是Ninject.web.Common(请求生命周期管理器所在的位置)的依赖项。既然您没有回答我的问题,我将以不同的方式问它:什么是(对你)DDD模式?