我在看Onion Architecture
馅饼,我很困惑......
UI客户是否有权访问Domain Model
和Domain Services
?或仅限于Application Services
和Core
?
确切地说,我问:UI Project是否应该引用Domain项目?
答案 0 :(得分:4)
当然,我不相信有充分的理由避免UI层知道和使用域对象。很明显,如果你这样做,你将UI层耦合到商务层,但最终,赢得的UI层依赖于商务?
另一方面,相反是不可取的,将bussines耦合到UI Layer是不好的做法。如果您想让几个UI图层访问相同的商务怎么办?这就是重点。
但请记住,没有金锤。不要寻找有关软件设计的明确规则,但要学习SOLID原则,这是值得的。
答案 1 :(得分:4)
洋葱架构和类似概念中最重要的概念是保持域层独立。它是通过将依赖关系限制为始终指向您发布的图表来实现的。
从UI项目到Domain项目的引用不会破坏此规则。
UI层应该只为每个用例发送命令到应用层。然而,即使有这种清晰的关注点分离,您也可能希望在这些命令中包含一些域层对象 - 最简单的例子是值类型和枚举。
Robert C. Martin's blog关于依赖关系的引用:
依赖规则
同心圆代表软件的不同领域。一般来说,你走的越远,软件就越高。外圈是机制。内圈是政策。
使这种架构工作的首要规则是依赖规则。此规则表明源代码依赖性只能指向内部。内圈中的任何东西都不能知道外圈中的某些东西。特别是,外圈中声明的内容的名称不得被内圈中的代码提及。这包括功能,类。变量或任何其他命名的软件实体。
出于同样的原因,外圈中使用的数据格式不应该被内圈使用,特别是如果这些格式是由外圈中的框架生成的话。我们不希望外圈中的任何东西影响内圈。
修改强>
在您的评论中,您提到将实体从域层移动到应用程序核心。在onion architecture中,术语“应用程序核心”表示域模型+域服务+应用程序服务。它不是一个单独的层。