Dependency injection 传统的三层体系结构与带IOC的三层体系结构

Dependency injection 传统的三层体系结构与带IOC的三层体系结构,dependency-injection,inversion-of-control,3-tier,Dependency Injection,Inversion Of Control,3 Tier,我正在构建一个包含表示层(PL)、业务逻辑层(BLL)和数据访问层(DAL)的三层体系结构。 传统的三层体系结构逻辑指出,BLL应该充当PL和DAL之间的中介。PL甚至不应该知道有数据库,而DAL不应该知道有BLL或PL。 实现上述功能将在3个不同的物理项目之间创建以下依赖关系,如下所示 PLProject->BLL DLL的引用 BLLProject->DAL DLL的引用 项目->无参考 但是,通过在BLL中定义接口,在BLL和DAL之间应用IOC的概念,以便DAL通过构造函数注入实现

我正在构建一个包含表示层(PL)、业务逻辑层(BLL)和数据访问层(DAL)的三层体系结构。
传统的三层体系结构逻辑指出,BLL应该充当PL和DAL之间的中介。PL甚至不应该知道有数据库,而DAL不应该知道有BLL或PL。

实现上述功能将在3个不同的物理项目之间创建以下依赖关系,如下所示

  • PLProject->BLL DLL的引用
  • BLLProject->DAL DLL的引用
  • 项目->无参考

但是,通过在BLL中定义接口,在BLL和DAL之间应用IOC的概念,以便DAL通过构造函数注入实现和使用DI,将改变依赖关系,如下所示

  • PLProject->BLL DLL的引用,DAL DLL的引用(对于BLL对象构造函数的具体类型的DI)
  • BLL项目->无参考
  • DALProject->BLL DLL的引用(用于实现BLL接口)
那么,国际奥委会和传统的三层架构是否存在冲突?

理想情况下,我希望实现以下目标,同时通过DI维护我的IOC。

  • PLProject->BLL DLL的引用
  • BLL项目->无参考
  • DALProject->BLL DLL的引用

你怎么做?

首先,你可以考虑使用接口解耦你的层,并且接口可以被分离成DLL的分隔。这样,每个层只依赖于下面层的接口

我也不知道为什么需要从DAL到BLL的耦合?这是回电话吗?你不能用事件来代替吗

假设所有3层都在流程中运行,并且假设您的PL是应用程序(合成根)的“入口点”,如果您已经分离出接口,并且PL中有引导代码,通常的依赖关系是:

  • PL=>对BLL和DAL(具体和接口)以及IoC容器的引用
  • BLL引用DAL(或仅引用接口,如果适用)
  • DAL无依赖关系(尽管通常依赖于DTO/POCO/实体)
PL可以将IoC配置卸载到引导程序dll,从而导致:

  • PL=>对BLL接口和引导程序的引用
  • Bootstrapper=>引用所有内容和IoC容器
  • BLL=>引用DAL接口
  • DAL=>无依赖性(尽管通常依赖于DTO/POCO/Entities)

对于某些容器,您可以通过以下方式避免引用引导程序中所有dll的要求。但是,这些DLL显然仍然需要与您的应用程序一起部署。

@@nonnb,您提到的DAL在两个选项中都没有依赖关系。但是我做了一个IOC,我在BLL中定义了IRepository接口。任何必须使用BLL的DAL都需要实现这些接口。逻辑是,任何数据库,因此DAL只是BLL实体的存储,因此DAL应该依赖于BLL,而不是相反。事后看来,OP可能将Evans风格的域模型称为BLL,因此需要从DAL引用域。另一种选择是使用单独的“贫血”DTO PO[CJ]Os进行DAL中的脱水/再水合。然后可以将这些映射到BLL/域模型,或从BLL/域模型映射到BLL/域模型。像Automapper这样的工具可以简化编码。DAL和BLL都会引用DTOsOld问题,但我认为另一个答案会有所帮助:。基本上,您不希望BLL引用DAL,而是使用IoC容器注入它。因此,您的合成根(应用程序入口点,可能在PL项目中)将引用所有DLL,或者使用后期绑定。