在DDD中,域服务是否本质上仅仅是门面和/或中介模式?


13

在域驱动设计中,域层可以具有多个(传统)服务。例如,对于用户域,我们可能有:

  • 一个UserFactory,它以不同的方式构建User对象
  • 一个用户存储库,负责与基础结构层中的持久性服务进行交互

域层中的UserService是仅仅是这两个服务和基础结构层的中介者和/或Facade,还是它还有更多内容?



我已经阅读了Gorodinski级别的文章,尽管从未见过第二个链接。读得好,绝对涉及一些重要方面!
e_i_pi

Answers:


11

Domain services 用不是的最好的描述:

  • 他们既不是也不EntitiesAggregate roots
  • 他们不是 Value objects
  • 所携带的领域知识并不自然地 适合一项Entity一项 Value object

一个a的例子Domain serviceSaga/Process manager:它协调了一个长期运行的过程,涉及多个Aggregate roots,可能来自不同的Bounded contexts

就是说,什么什么Domain service以及如何实现是两个正交的事情。

域层中的UserService是仅仅是这两个服务和基础结构层的中介者和/或Facade,还是它还有更多内容?

可以使用设计模式来实现某些域服务,例如,UserRepository(由中定义的接口Domain layer和中的具体实现组成Infrastructure layer) 。其他域服务则不是。Facade

除了必须不要依赖其他层(和SOLID)的重要规则外,没有关于如何实现它们的硬规则。Domain layer


谢谢,我想我终于了解了域层。除了保存数据对象(聚合,实体和值对象)外,它还保存业务规则-但不保存那些规则的具体实现。域服务定义了您可以对域数据对象执行的操作,但是不知道这些操作如何在内部起作用。
e_i_pi

1
@e_i_pi业务规则仅受聚合及其嵌套实体的保护。域服务不参与其中。
康斯坦丁·加尔贝努

1
@e_i_pi,其中操作涉及多个聚合。例如,给定某人(另一个汇总)的BankAccounts(汇总)列表,域服务将计算这些帐户的总余额。
康斯坦丁·加尔贝努

1
@e_i_pi:我认为您有一些误解。因此,整个域层都是您域的软件模型。您说-“除了保存数据对象(聚合,实体和值对象)以外”-从它们仅保存数据的意义上说,它们不是“数据对象”;这些实际上执行域规则,它们定义行为。现在,根据E. Evans撰写的DDD书域服务域中那些不自然地适合对象(实体或值对象)的方面。
FilipMilovanović17年

1
而是,域服务 “纯粹是根据它可以为客户做的事情定义的”,是根据域模型的其他元素定义的(因此,它以某种方式编排了这些元素,并执行了控制该编排的域规则)。域服务本身是无状态的。还有应用服务的概念,它驻留在较高层中,并且通过充当与域层的接口来实现用户故事或等效的用例。请注意,对象与服务的比率将根据要建模的域而变化。
FilipMilovanović17年

1

我看到DDD中的服务是依赖倒置的结果。

如果要使用“普通”依赖关系,则域代码将调用数据库以保存或查询创建实体的实体或工厂,该实体或实体与数据库或外部服务或某种其他基础结构代码绑定在一起。

但这不是域代码应有的方式。域代码不应依赖于基础结构代码。由于这种依赖性使测试和可能的重用变得更加困难。这就是为什么您要反转该依赖关系的原因。您使基础结构代码取决于域代码。为此,您需要引入一个抽象。定义域代码预期由基础结构实现的行为的抽象。

而DDD中的服务就是这种抽象。在大多数情况下,对于域代码,那些服务应该是纯接口。实现应该在基础结构代码中进行,该代码依赖于这些接口。


感谢您的回答,两个答案都给了我“啊哈!” 时刻。我认为,如果没有您的回答,我可能不会完全理解这个概念,但是我更喜欢康斯坦丁的答案作为未来读者的指示。
e_i_pi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.