依赖注入 – 传统的3层架构与3层的IOC

我正在构建一个带有表示层(PL),业务逻辑层(BLL)和数据访问层(DAL)的3层体系结构.

传统的3层架构逻辑表明BLL应该充当PL和DAL之间的中介. PL不应该知道存在数据库,而DAL不应该知道存在BLL或PL.

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

  • PL   Project -> Reference of BLL DLL
  • BLL Project -> Reference of DAL DLL
  • DAL Project -> No Reference

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

  • PL   Project -> Reference of BLL DLL, Reference of DAL DLL (for DI of concrete types to constructors of the BLL Objects)
  • BLL Project -> No Reference
  • DAL Project -> Reference of BLL DLL (for implementation of BLL Interfaces)

国际奥委会和传统的三层冲突也是如此吗?

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

  • PL   Project -> Reference of BLL DLL
  • BLL Project -> No Reference
  • DAL Project -> Reference of BLL DLL

你怎么做到这一点 ?

最佳答案 首先,您可以考虑使用接口来解耦图层,并且可以将接口分隔为单独的dll.这样,每个层只依赖于下面层的接口.

我也不确定为什么你需要从DAL到BLL的耦合?这是回电吗?你不能用事件吗?

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

> PL =>引用BLL和DAL(具体和接口)以及IoC容器
> BLL引用DAL(或仅仅是接口,如果适用)
> DAL没有依赖关系(尽管通常会依赖于DTO / POCO / Entities)

PL可以将IoC配置卸载到Bootstrapper dll,从而导致:

> PL =>引用BLL接口和引导程序
> Bootstrapper =>引用所有内容和IoC容器
> BLL =>参考DAL接口
> DAL =>没有依赖(虽然通常会依赖于DTO / POCO / Entities)

对于某些容器,您可以避免在using configuration, or convention之前从引导程序引用所有dll的要求.但是,这些dll显然仍然需要与您的应用程序一起部署.

点赞