如何确定业务操作(方法)应该驻留在域对象(类)还是域服务(类)中?

时间:2015-04-25 08:41:44

标签: oop design-patterns domain-driven-design

根据“域驱动设计”,域服务封装了自然不适合域对象的业务逻辑。域服务的定义很明确,但我如何区分业务操作是属于域对象还是域服务。例如我有一个Account类和一个业务动作调用传输,域服务和域对象都可以完成传输任务。我应该选择哪一个?

public class Account
{
  public void Transfer(Account bar)
  {
     //do something
  }
}
public class AccountService
{
  public void Transfer(Account foo,Account bar)
  {
     //do something
  }
}

2 个答案:

答案 0 :(得分:1)

在“领域驱动设计”中,Eric Evans表示:

  

当域中的重要流程或转换不是自然责任时   ENTITY或VALUE OBJECT,作为声明为a的独立接口向模型添加操作   SERVICE。

这里最重要的一点可能是自然责任

由于将资金从一个账户转移到另一个账户并不是账户的实际责任,我会选择服务方式。

如果其他操作可能与转移相关,则会更加清晰。 Account类的职责是封装相关数据。

帐户责任的示例如下:

  • 告诉当前的余额(例如是否为负数?)
  • 告知帐户是否已关闭
  • 告诉谁是所有者
  • 增加或减少余额
  • 显示余额变化的历史记录

请注意,所有这些职责仅涉及对象本身或其关联或聚合对象。

答案 1 :(得分:0)

转账是账户的自然责任。它可能需要辅助对象。对象应该是活动的,而不是被动数据持有者。