域对象和服务如何在DDD中交互?

时间:2012-06-18 05:26:04

标签: domain-driven-design domainservices

'因此,在此上下文中,我们创建了一个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

1 个答案:

答案 0 :(得分:1)

问题与此类似:https://softwareengineering.stackexchange.com/a/62193/19252

您引用的博客文章在您的问题上做得很好。简而言之:如果可以在模型中完成(并进行单元测试!),请在那里进行。域服务相当于例外而不是规则。

让我引用那篇文章:

“ - Are'nt服务不好,我们不应该按照OO使用所有对象吗?

是的,服务倾向于与面向对象设计正交。 [...]建模领域有一种巨大的趋势,即使用过多的服务“

至于我,这种趋势来自于.NET / Java持久性架构的缺陷,就像将业务逻辑放入setter方法一样不可能。