2

'所以正是在这种情况下,我们创建了一个Order.adjust()方法,将调用委托给OrderAdjust Service. 有Order.adjust()一个优势,它使Order自己的调整操作。

这是怎么做到的?是否注入了域服务?

$order = new Order();
$order->adjust(???);

域服务在无状态的情况下如何对域实体进行操作?如果将域服务注入实体,则只能在引用上调用方法,因此必须存在状态?

$service = DomainService();

$entity = DomainEntity();
$entity->operation($service);

// Inside DomainEntity
public function operation(DomainService &$service)
{
    // Operations are delegated to the domain service reference
    $service->operation();
    $service->operation2();
}

$another_entity = AnotherDomainEntity();

// What happened in the first object must be known here
// otherwise what's the point?
$another_entity->operation($service);

不应该像这样或在应用程序服务中完成吗?

$domain_service = new DomainService();
$entity = new DomainEntity();
$another_entity = new AnotherDomainEntity();

$domain_service->performOperation($entity, $another_entity);

域实体/对象之间的操作是如何完成的?域对象通常如何通信?它们在哪里实例化?

代码示例将不胜感激。

来源: http ://stochastyk.blogspot.no/2008/05/domain-services-in-domain-driven-design.html

4

1 回答 1

1

这个问题类似于这个问题:https ://softwareengineering.stackexchange.com/a/62193/19252 。

您引用的博客文章很好地解决了您的问题。简而言之:如果可以在模型中完成(并且经过单元测试!),请在模型中完成。域服务是例外而不是规则。

让我引用那个帖子:

“- 服务不坏吗?我们不应该按照 OO 使用所有对象吗?

是的,服务往往与面向对象设计正交。[...] 建模界存在使用过多服务的巨大趋势”

对我来说,这种趋势来自 .NET/Java 持久性架构的缺陷,比如无法将业务逻辑放入 setter 方法中。

于 2012-06-19T06:56:08.737 回答