【问题标题】:Onion Architecture - can different segments of the outer layer depend on each other?洋葱架构——外层的不同部分可以相互依赖吗?
【发布时间】:2014-05-31 06:25:39
【问题描述】:

我正在尝试根据洋葱架构方法重构系统。

我的外层包括以下部分

  1. WCF Web 服务(我们提供)

  2. 用于数据库访问的基础设施类

  3. 用于访问外部 Web 服务的基础架构类

  4. 测试

我想再次检查是否允许外层的不同部分相互依赖。例如,WCF 类可以直接依赖于基础结构程序集中的任何代码吗?

据我了解,这是不允许的。例如,WCF 代码应该只依赖于内层的代码(例如接口)。你能确认一下吗?

PS

我有点困惑,因为一方面有些文章证实了这一点:

http://blog.ploeh.dk/2013/12/03/layers-onions-ports-adapters-its-all-the-same/

您可能已经注意到,我将橙色、黄色和 将蓝色框分成单独的集群。这是因为我还想 应用 UI 组件不能依赖数据访问的旧规则 组件,反之亦然。因此,我在 这些群体

但另一方面,测试(例如基础设施程序集中的代码)与基础设施程序集位于同一层并直接依赖于它们。

【问题讨论】:

    标签: architecture n-tier-architecture onion-architecture


    【解决方案1】:

    就物理程序集而言,基础设施程序集(包含解决问题的代码的程序集 [通常] 使用特定框架)不应直接相互引用。相反,您应该致力于(至少根据我的经验)从这些程序集中提取接口并将它们放入一个单独的程序集中,其他基础设施程序集可以引用该程序集。以您的(近似)情况为例,您可以执行以下操作:

    注意事项:

    • 所有框都代表实际的程序集(Visual Studio 中的项目)。
    • 绿色方框代表接口组件,而红色方框代表基础设施组件
    • 接口程序集包含抽象类、接口、常量等。它们为基础设施程序集提供抽象以供使用。
    • 基础架构程序集包含特定于框架的代码并实现所引用接口程序集中包含的抽象。
    • 引导程序不是必需的,您可以将初始化逻辑放入您的Global.asax
    • 在 WCF 服务的启动过程中,将调用注册类型映射的依赖关系解析。
    • 每个程序集都有自己的测试程序集(如果需要)。
    • 此设计可防止“在同一层”的程序集之间的循环引用。
    • 您可以轻松地将 Google 地图替换为 Bing 地图,并将实体框架替换为 NHibernate。唯一改变的引用是在依赖解析中。

    如果您需要更多信息,请告诉我。

    【讨论】:

    • 我想指出,提议的解决方案不使用与洋葱架构相同的命名约定。不过这对我很有用。
    猜你喜欢
    • 2017-11-23
    • 2019-05-13
    • 2011-01-21
    • 2013-01-31
    • 2023-04-02
    • 2015-11-05
    • 2015-03-17
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多