裸对象模式与洋葱架构

Naked objects pattern vs Onion architecture

我对领域驱动设计的理解越来越深入,对裸对象模式和洋葱架构如何相互关联感到有点困惑?

单独来看它们与 DDD 的关系很清楚,但是否也可以将它们相互关联起来?

(利益声明:我是 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 的原则可以进一步应用于领域模型中——确保所有领域服务,例如,仅由接口定义和使用。我见过一些人试图让域对象之间的所有交互仅通过接口传递,但我从未见过它可以在任何规模上工作并且看不到它的价值。您可能想阅读 'Cluster' 模式,这是一种将非常大的复杂域模型分解为具有严格依赖层次结构的独立集群的模式。这种模式不依赖于 NO,但在实践中,如果您没有受益于 NO,那么采用它就没有什么意义了。

这里我要谈谈我的要点,首先是什么导致了 NO 模式的定义。在整个架构中采用严格的关注点分离原则非常好。但是除非你能达到持久层 表示层都是 100% 自动派生自领域对象模型的地步,否则你最终会失去很多优势关注点分离,因为对域模型的任何更改都意味着对其他层的更改,即使不是直接的,也是间接的。现代 ORM 在域模型到持久层映射方面做得很好; Naked Objects 为领域模型做到了 UI 层。

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