c# - 当我的复合根引用数据层时,我的 DI 架构是否正确?

标签 c# asp.net-mvc dependency-injection ninject

我正在开发一个 ASP.NET MVC 应用程序。同时,我正在关注 Mark Seemann 的《.NET 中的依赖注入(inject)》一书。我的解决方案有一个数据访问层、一个域层和一个 Web 应用程序项目。书的第二章说我应该将 Controller 和 View 模型放在单独的表示层中,这就是我现在正在尝试做的事情。

一切进展顺利。我的目标是在构建这个应用程序时考虑到 DI。我的网络应用程序仅引用域层,数据层仅引用域层。一切都尽可能地解耦。

但是,我的 Web 应用程序项目使用 Ninject 作为容器,并且在一个名为 NinjectWebCommon 的类中,我必须注册我的类型之一,如下所示:

kernel.Bind<ITransactionRepository>().To<TransactionRepository>();

如您所见,我现在必须引用位于我的数据层中的 TransactionRepository。我的 Web 应用程序引用数据层可以吗?应该是?或者有其他解决方案来防止这种耦合吗?我应该将 NinjectWebCommon 移至表示层吗?我不确定这种情况下的最佳实践是什么。不幸的是,当涉及 ASP.NET MVC 应用程序中的表示层时,本书并没有详细介绍。

最佳答案

是的 - 这很好。您的合成根需要引用它所使用的所有内容。否则它会如何解决抽象问题?

这里的项目引用和依赖项之间存在语义差异。

引用是您的 DI 容器必须具备的东西才能完成其工作 - 您无法避免这一点。

您可以通过不编写表示层代码来依赖于数据层的具体实现(仅依赖于域层中的抽象)来避免依赖性。

换句话来说,引用是配置的必需元素,而依赖项是您的实现选择依赖的东西。

考虑一些 MVC Controller

public class SomeController 
{ 
    private ISomeRepository repository; 
    public SomeController(ISomeRepository repository) 
    { 
        this.repository = repository; 
    }

    // ... 
}

该 Controller 依赖于域层,这是预期的。对比一下:

public class SomeController 
{ 
    private SomeRepository repository; 
    public SomeController(SomeRepository repository) 
    { 
        this.repository = repository; 
    }

    // ... 
}

此实现对数据层具有硬依赖性,这是不希望的。

关于c# - 当我的复合根引用数据层时,我的 DI 架构是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31577384/

相关文章:

c# - 使用 AutoMapper 映射相同值时出错

c# - Vigenere Square Lookup(使用字符串数组)

c# - 一个中间件应该总是调用下一个?

c# - 为什么 XmlSerializer 要求从 IEnumerable 继承的类型具有 Add(System.Object) 的实现?

JQuery - 使用 JSON 的属性创建输入

c# - 使用 Unity 注入(inject)特定实现

jsf - Java EE 中 CDI 技术的用途及其与 JSF 等 UI 技术和 EJB 等后端技术的关系

dependency-injection - IoC和DI到底有什么区别

c# - 在 ASP.NET 中为特定页面设置无缓存?

asp.net-mvc - MVC3 ModelBinding 到带有索引间隙回发的集合