洋葱建筑 - 外层的不同部分可以相互依赖吗?

时间:2014-04-16 11:43:08

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

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

我的外层包含以下部分

  1. WCF网络服务(我们提供)

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

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

  4. 测试

  5. 我想仔细检查外层的不同段是否允许彼此依赖。例如,WCF类可以直接依赖于基础架构程序集中的任何代码吗?

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

    PS

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

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

    你可能已经注意到我把橙色,黄色和黄色分组了   蓝色框分成不同的簇。这是因为我还是想   应用UI组件不得依赖于数据访问的旧规则   组件,反之亦然。因此,我介绍之间的舱壁   这些团体

    但另一方面,测试(例如基础架构组件中的代码)与基础架构组件位于同一层,并且直接依赖于它们。

1 个答案:

答案 0 :(得分:1)

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

Example Onion Architecture

注意事项:

  • 所有方框都代表实际程序集(Visual Studio中的项目)。
  • 绿色框表示接口程序集,而红色框表示基础架构程序集
  • 接口程序集包含抽象类,接口,常量等。它们提供了要使用的基础结构程序集的抽象。
  • 基础架构程序集包含特定于框架的代码,并实现引用的接口程序集中包含的抽象。
  • 不一定需要引导程序,您可以将初始化逻辑放在Global.asax中。
  • 在WCF服务的starup过程中,调用依赖项解析来注册类型映射。
  • 每个组件都有自己的测试组件(如果需要)。
  • 此设计可防止组件与#34;在同一层"。
  • 之间进行循环引用
  • 您可以使用NHibernate轻松地将Bing Maps替换为Bing Maps和Entity Framework。唯一更改的引用位于依赖关系解析中。

如果您需要更多信息,请与我们联系。