洋葱架构:UI项目是否可以访问域层?

时间:2015-10-13 20:08:21

标签: java c# architecture domain-driven-design onion-architecture

我在看Onion Architecture馅饼,我很困惑......

enter image description here

UI客户是否有权访问Domain ModelDomain Services?或仅限于Application ServicesCore

确切地说,我问:UI Project是否应该引用Domain项目?

2 个答案:

答案 0 :(得分:4)

当然,我不相信有充分的理由避免UI层知道和使用域对象。很明显,如果你这样做,你将UI层耦合到商务层,但最终,赢得的UI层依赖于商务?

另一方面,相反是不可取的,将bussines耦合到UI Layer是不好的做法。如果您想让几个UI图层访问相同的商务怎么办?这就是重点。

但请记住,没有金锤。不要寻找有关软件设计的明确规则,但要学习SOLID原则,这是值得的。

答案 1 :(得分:4)

洋葱架构和类似概念中最重要的概念是保持域层独立。它是通过将依赖关系限制为始终指向您发布的图表来实现的。

从UI项目到Domain项目的引用不会破坏此规则。

UI层应该只为每个用例发送命令到应用层。然而,即使有这种清晰的关注点分离,您也可能希望在这些命令中包含一些域层对象 - 最简单的例子是值类型和枚举。

Robert C. Martin's blog关于依赖关系的引用:

  

依赖规则

     

同心圆代表软件的不同领域。一般来说,你走的越远,软件就越高。外圈是机制。内圈是政策。

     

使这种架构工作的首要规则是依赖规则。此规则表明源代码依赖性只能指向内部。内圈中的任何东西都不能知道外圈中的某些东西。特别是,外圈中声明的内容的名称不得被内圈中的代码提及。这包括功能,类。变量或任何其他命名的软件实体。

     

出于同样的原因,外圈中使用的数据格式不应该被内圈使用,特别是如果这些格式是由外圈中的框架生成的话。我们不希望外圈中的任何东西影响内圈。

修改

在您的评论中,您提到将实体从域层移动到应用程序核心。在onion architecture中,术语“应用程序核心”表示域模型+域服务+应用程序服务。它不是一个单独的层。