设置层间依赖倒置

Setting the Dependency Inversion between layers

任何人都可以解释如何使用 DI IOC 在基于层的体系结构中设置层之间的依赖关系,还请解释当我们在 UI 层中创建组合根时,我们需要引用 [=] 中的所有 dll 18=] 层这为 UI 开发人员直接访问 DAL 层对象留出了空间。这将违反 UI 层不应直接访问 DAL 对象的规则。

任何架构师 SME 都可以解释使用下面提到的技术栈实现基于分层架构的正确方法是什么。

这里的技术偏好是 ASP.NET MVC 4,REST API 服务,企业库(存储库模式)

我觉得这就是UI层"should not"访问DAL层和"can not"的区别。强制分层确实很复杂,使得 UI 层真正无法访问 DAL。关键是,您 不应该 不从 UI 访问 DAL。

就像您不应该从 UI 层访问数据库本身一样,但是没有什么可以阻止流氓开发人员这样做。

顺便问一下,您是手动创建合成根吗?您可能应该看看 DI 框架。它会隔离很多这些依赖关系,是的,它需要了解所有层,但它会将这些东西放在一个相当干净的地方。这家伙对其中的一些有一个不错的总结:https://rules.ssw.com.au/do-you-know-the-best-dependency-injection-container-(aka-do-not-waste-days-evaluating-ioc-containers)

您正在将 N 层与 DI 混合使用。两者都是不相关的概念,彼此不依赖。为了获得最佳输出,您需要对这两个概念进行深入研究,制作多个原型并选择最适合您的设计。

这仅仅是因为没有 "correct" 或 "incorrect" 方法可以使用这些技术堆栈来实现这两个概念。实现这一目标的方法实在是太多了。

例如:简单的 3 层。由 DAL(带有数据模型)、BLL 引用 DAL 和 Presentation

组成

4 层。数据模型层、DAL 引用数据模型、BLL 引用数据模型、使用依赖注入的表示

DDD(领域驱动开发),有领域模型,数据库领域模型,表现层(附加CQRS)

做你最熟悉的事情。稍后重构/重写。

SO 中这个问题的答案给了我我们正在寻找的答案或解释 Dependency Injection vs Layered Architecture

谢谢