【问题标题】:Onion Architecture: Should UI project have access to Domain Layer? [closed]洋葱架构:UI 项目应该可以访问领域层吗? [关闭]
【发布时间】:2016-01-11 17:41:43
【问题描述】:

我在看Onion Architecture pie,我很困惑……

UI 客户端是否应该有权访问 Domain Model 和 Domain Services?还是只发给Application Services 和Core?

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

【问题讨论】:

  • 我讨厌这种教条。我认为答案取决于很多事情。如果您正在编写与 REST Web 服务通信的 Web UI,我会给您不同的答案。这就是像 DTO 层这样保持“纯度”的反模式的来源。
  • 通常事情不应该直接访问除了它们的直接邻居之外的任何东西。因为结果很容易变成一个混乱的依赖网络。但是,只要您通过应用服务/应用核心获得对域对象的访问权限,我认为这没有违反。
  • 我说的是Enums 或其他Entites。例如,当应用程序服务方法以Enum 作为参数或返回某个Entity 的对象时。在这种情况下,是否应该将 Enum 或 Entity 移至 Core?
  • 应用核心不是一个单独的层,它是域模型、域服务和应用服务在一起的通用术语。
  • 阅读 J2EE 设计模式和 DTO。他们就是我所指的问题。我认为创建一个单独的对象层来镜像您的域模型只是将它们传递给 UI 层是一种浪费。

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


【解决方案1】:

当然,我认为没有充分的理由避免 UI 层了解和使用域对象。很明显,如果你这样做,你是在将 UI Layer 耦合到 Bussines Layer,但最终,UI Layer 不会依赖于 bussines 吗?

另一方面,相反的做法是不可取的,将业务耦合到 UI 层并不是一个好的做法。如果你想让多个 UI 层访问相同的业务怎么办?这就是重点。

但请记住,没有金锤。不要在软件设计上寻找绝对的规则,而是学习 SOLID 原则,这是值得的。

【讨论】:

  • 我知道相反是不可取的。但我认为(一秒钟)UI 客户端中使用的 Domain 中的所有内容都应该移至 Core 层
  • 使用域对象作为遍历层是很常见的,但这并不意味着你必须一直这样使用它。
  • 是的,但仅限于类型或枚举之类的对象。当我有一个函数(比如说域实体中的方法)时,我在应用程序服务中使用它,在 UI 中使用应用程序服务。
  • 我假设域服务是存储库层。现在的问题是如何让我的 UI 层使用存储库来持久化一个新的域对象。这只能使用应用程序服务来完成。因为,应用程序服务在将此域对象持久化到数据存储之前验证域模型并运行一些其他规则。
【解决方案2】:

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

从 UI 项目到域项目的引用不会违反此规则。

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

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

依赖规则

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

使这个架构工作的最重要的规则是依赖规则。该规则表示源代码依赖项只能指向内部。内圈中的任何人都无法对外圈中的事物一无所知。特别是,在外圈中声明的事物的名称不能被内圈中的代码提及。这包括函数、类。变量,或任何其他命名的软件实体。

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

编辑

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

【讨论】:

  • 谢谢!现在一切都变得更有意义了
  • 我假设域服务是存储库层。现在的问题是如何让我的 UI 层使用存储库来持久化一个新的域对象。这只能使用应用程序服务来完成。因为,应用服务在将此域对象持久化到数据存储之前验证域模型并运行一些其他规则
猜你喜欢
  • 2017-11-23
  • 2015-11-05
  • 2015-03-17
  • 2016-12-28
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2011-10-09
  • 2013-06-30
相关资源
最近更新 更多