0

我越来越了解领域驱动设计,并且对裸对象模式和洋葱架构如何相互关联有点困惑?

单独它们与 DDD 的关系是非常清楚的,但是否也可以将它们相互关联?

4

1 回答 1

3

(利益声明:我是 Naked Objects 架构模式的作者,并管理 Naked Objects Framework - NOF。)

我自称不太了解 Onion 架构,但在某种程度上,这些想法似乎与 Naked Objects 兼容;在另一个层面上,它将苹果与橙子进行比较。

洋葱架构是一组设计原则,您可以在使用各种技术和模式从头开始构建架构时应用这些原则。理论上,Naked Objects 也是如此;实际上,您只能通过使用实现它的框架构建系统来采用裸对象模式——编写自己的框架太像艰苦的工作。Naked Objects Framework 是最大、最纯粹的此类框架,但不是唯一的。

所以有意义的比较不是洋葱原则和 NO原则之间的比较,而是前者和 NO 原则的具体实现之间的比较。显然,我将使用 NOF 作为示例。

NOF 非常强烈地实现和强制执行 Onion 源自的原则:非常强的关注点分离。领域模型几乎完全独立于基础设施:唯一的联系点是通过一个单一的、非常轻量级的接口(IDomainObjectContainer),它定义了一个服务,其实现会自动注入到任何需要它的领域实体或服务中.

比 Onion 架构更强大的是,您的 UI对域模型的依赖性为零——因为它是通用的。(除非您开始自定义 UI,在这种情况下,您可能会失去 NO 模式的好处)。

Onion 的原则可以进一步应用于域模型——例如,确保所有域服务仅由接口定义和使用。我见过一些人试图让域对象之间的所有交互都只通过接口,但我从来没有看到这可以在任何规模上工作,并且看不到它的价值。您可能想阅读“集群”模式,这是一种将非常大的复杂域模型分解为具有严格依赖层次结构的独立集群的模式。这种模式不依赖于 NO,但在实践中,如果你没有 NO 的好处,那么采用它就没有什么意义。

在这里,我来到我的主要观点,首先是什么导致了 NO 模式的定义。采用严格的原则来分离整个体系结构的关注点非常好。但是,除非您能够达到持久层表示层都 100% 自动从域对象模型派生的程度,否则您最终会失去关注点分离的大部分优势,因为对域的任何更改模型意味着对其他层的更改,如果不是直接的话,也是间接的。现代 ORM 在域模型到持久层映射方面做得很好;Naked Objects 为 UI 层的领域模型做到了这一点。

简而言之,如果您采用一个坚定地致力于 NO 原则的框架,您将获得 Onion 所声称的好处。如果您的愿望或需要是构建自己的架构并且您想采用 Onion 原则,那很好,但不值得尝试弄清楚如何以某种方式将任何 NO 原则改进到该自定义架构:它将是非常难,而且您可能看不到任何好处。

于 2018-03-28T09:53:13.717 回答