Domain driven design 裸对象模式与洋葱架构

Domain driven design 裸对象模式与洋葱架构,domain-driven-design,onion-architecture,naked-objects,Domain Driven Design,Onion Architecture,Naked Objects,我越来越了解领域驱动设计,对裸对象模式和洋葱架构如何相互关联感到困惑 它们各自与DDD的关系非常清楚,但是否也可以相互联系 (利益声明:我是裸体对象体系结构模式的作者,负责管理裸体对象框架-NOF。) 我并不自称对洋葱建筑很了解,但在某种程度上,这些想法似乎与裸露的物体兼容;在另一个层面上,它将苹果与橙子进行比较 洋葱架构是一组设计原则,您可以在使用各种技术和模式从头开始构建架构时应用这些原则。理论上,裸体物体也是如此;实际上,您只能通过使用实现它的框架构建系统来采用裸对象模式——编写自己的系统

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

它们各自与DDD的关系非常清楚,但是否也可以相互联系

(利益声明:我是裸体对象体系结构模式的作者,负责管理裸体对象框架-NOF。)

我并不自称对洋葱建筑很了解,但在某种程度上,这些想法似乎与裸露的物体兼容;在另一个层面上,它将苹果与橙子进行比较

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

因此,有意义的比较不是洋葱原则和无原则之间的比较,而是洋葱原则和无原则的具体实施之间的比较。很明显,我将以NOF为例

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

甚至比洋葱架构更强大的是,您的UI对域模型没有依赖性——因为它是通用的。(除非您开始定制UI,否则您可能会失去NO模式的好处)

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

在这里,我来谈谈我的主要观点,是什么首先导致了NO模式的定义。采用严格的原则在整个体系结构中分离关注点是非常好的。但是,除非您能够实现持久性层和表示层都100%自动地从域对象模型派生出来,否则您最终会失去这种分离关注点的优势,因为对域模型的任何更改都意味着对其他层的更改,即使不是直接更改,也会间接更改。现代ORMs在域模型到持久层映射方面做了大量工作;裸体对象为域模型到UI层做了这件事

简言之,如果您采用一个坚定地致力于NO原则的框架,您将获得洋葱的声称好处。如果您的愿望或需求是构建自己的体系结构,并且您希望采用洋葱原则,那么这很好,但不值得尝试找出如何以某种方式将任何无原则改造到该定制体系结构:这将非常困难,并且您可能看不到任何好处

(利益声明:我是裸体对象体系结构模式的作者,负责管理裸体对象框架-NOF。)

我并不自称对洋葱建筑很了解,但在某种程度上,这些想法似乎与裸露的物体兼容;在另一个层面上,它将苹果与橙子进行比较

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

因此,有意义的比较不是洋葱原则和无原则之间的比较,而是洋葱原则和无原则的具体实施之间的比较。很明显,我将以NOF为例

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

甚至比洋葱架构更强大的是,您的UI对域模型没有依赖性——因为它是通用的。(除非您开始定制UI,否则您可能会失去NO模式的好处)

洋葱的原则可以在域模型中进一步应用——例如,确保所有域服务都仅由接口定义和使用。我见过一些人试图让域对象之间的所有交互都只通过接口,但我从未见过这种方法可以在任何规模下工作,并且没有看到什么价值。您可能想阅读“集群”模式,这是一种使用stri将非常大的复杂域模型分解为独立集群的模式