我正在开发一个 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/