我正在构建一个带有表示层(PL),业务逻辑层(BLL)和数据访问层(DAL)的3层体系结构. 传统的3层架构逻辑表明BLL应该充当PL和DAL之间的中介. PL不应该知道存在数据库,而DAL不应该知道存在BLL或
传统的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显然仍然需要与您的应用程序一起部署.