如何确定业务操作(方法)应该驻留在域对象(class)还是域服务(class)中?
How to figure out whether a business action(method) should reside in domain object(class) or domain service(class)?
根据"Domain Driven Design",领域服务封装了自然不适合领域的业务逻辑object.The领域服务的定义很清楚,但是我如何区分业务操作是否属于域对象或域 service.For 示例 我有一个帐户 class,一个业务操作呼叫转移,域服务和域对象都可以完成转移 task.which 我应该选择一个吗?
public class Account
{
public void Transfer(Account bar)
{
//do something
}
}
public class AccountService
{
public void Transfer(Account foo,Account bar)
{
//do something
}
}
在 "Domain Driven Design" 埃里克·埃文斯 (Eric Evans) 中指出:
When a significant process or transformation in the domain is not a natural responsibility of an
ENTITY or VALUE OBJECT, add an operation to the model as a standalone interface declared as a
SERVICE.
这里最重要的一点可能是自然责任。
既然从一个账户转账到另一个账户并不是账户的实际责任,我会选择服务方式。
如果其他操作可能与转移有关,这会变得更加清楚。
Accountclass的职责是封装相关数据。
帐户责任示例如下:
- 说出当前的余额(比如是负数吗?)
- 判断账户是否关闭
- 告诉谁是所有者
- 增加或减少余额
- 显示余额变化历史
请注意,所有这些责任仅指对象本身或其关联或聚合的对象。
转账是账户的自然职责。它可能需要辅助对象。对象应该是主动的,而不是被动的数据持有者。
根据"Domain Driven Design",领域服务封装了自然不适合领域的业务逻辑object.The领域服务的定义很清楚,但是我如何区分业务操作是否属于域对象或域 service.For 示例 我有一个帐户 class,一个业务操作呼叫转移,域服务和域对象都可以完成转移 task.which 我应该选择一个吗?
public class Account
{
public void Transfer(Account bar)
{
//do something
}
}
public class AccountService
{
public void Transfer(Account foo,Account bar)
{
//do something
}
}
在 "Domain Driven Design" 埃里克·埃文斯 (Eric Evans) 中指出:
When a significant process or transformation in the domain is not a natural responsibility of an ENTITY or VALUE OBJECT, add an operation to the model as a standalone interface declared as a SERVICE.
这里最重要的一点可能是自然责任。
既然从一个账户转账到另一个账户并不是账户的实际责任,我会选择服务方式。
如果其他操作可能与转移有关,这会变得更加清楚。 Accountclass的职责是封装相关数据。
帐户责任示例如下:
- 说出当前的余额(比如是负数吗?)
- 判断账户是否关闭
- 告诉谁是所有者
- 增加或减少余额
- 显示余额变化历史
请注意,所有这些责任仅指对象本身或其关联或聚合的对象。
转账是账户的自然职责。它可能需要辅助对象。对象应该是主动的,而不是被动的数据持有者。