c# - DDD 和依赖注入(inject)

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

我目前正在尝试将 DDD 模式与依赖注入(inject)(使用 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(呵呵...)(将上下文注入(inject)存储库,解析单例服务...),我在我的 App 项目中创建了一个静态类创建一个 IKernel 实例并在应用程序启动时注册所有依赖项。

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

此外,通过将域存储库和服务接口(interface)绑定(bind)到基础设施层的具体实现,我根据实现来制作我的应用程序,这真的感觉不对。

我该如何解决这些问题?

最佳答案

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

听起来你已经自己发明了这个,我真的感觉不到问题 - 因为这是引用所有东西的最顶级项目,包括 web、owins、ninjects 和其他,这里真的应该没有问题.

我的建议是永远不要使用单例。相反,有工厂或本地依赖解析器。解析器是本地基础设施的一部分,充当在隔 ionic 系统中创建服务的中心。解析器可以被周围环境安全地使用,它不引用任何东西,但它有一个可配置的 provider,它再次在 Composition Root 中设置。

这样,如果解析器使用特定的实现甚至特定的 DI 容器,所有它都设置在最顶层的项目中。

关于c# - DDD 和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22151481/

相关文章:

c# - 如何在 C# 中优化枚举赋值

asp.net-mvc - ASP.NET MVC3 - 3 Tier design - 事务控制和业务层设计问题

c - MVC 用纯 C 实现

angular - 创建 AoT 兼容的服务工厂

spring - Spring注入(inject)中是否需要默认构造函数?

c# - 我如何正确使用依赖注入(inject)?

c# - 程序员说 "Code against an interface, not an object."是什么意思?

c# - 向所有查询 Entity Framework 添加过滤器

c# - 如何从 ListView 中拉取一种类型的项目

java - 支持多个 xsd 版本