Domain driven design 域对象和服务
有人质疑“你永远不会让域对象实现自己调用服务!”。这是DDD的硬性规定,还是取决于您自己的应用程序和体系结构 人为的例子: 例如,假设我们的模型中有一个Domain driven design 域对象和服务,domain-driven-design,Domain Driven Design,有人质疑“你永远不会让域对象实现自己调用服务!”。这是DDD的硬性规定,还是取决于您自己的应用程序和体系结构 人为的例子: 例如,假设我们的模型中有一个UserImage对象,该对象由用户从上传的图像中填充。然后假设我们可以将此图像提交给第三方服务,该服务可以识别指纹,并在找到匹配项时返回Guid public IThumbPrintService { Guid FindMatch(Bitmap image); } public class UserImage { public
UserImage
对象,该对象由用户从上传的图像中填充。然后假设我们可以将此图像提交给第三方服务,该服务可以识别指纹,并在找到匹配项时返回Guid
public IThumbPrintService {
Guid FindMatch(Bitmap image);
}
public class UserImage {
public Bitmap Image {get; set;}
public Guid ThumbPrintId {get; set;}
public bool FindThumbPrintMatch() {
// Would you call the service from here?
ThumbPrintId = _thumbPrintService.FindMatch(this.Image);
return ! ThumbPrintId.CompareTo(Guid.Empty);
}
}
public class RoboCopUserImageService : IUserImageService {
// Or move the call to a service method
// since it depends on calling a separate service interface
public bool FindThumbPrintMatch(UserImage userImage) {
userImage.ThumbPrintId = _thumbPrintService.FindMatch(userImage.Image);
return !userImage.ThumbPrintId.CompareTo(Guid.Empty);
}
}
不让域对象自己调用服务可以避免或获得什么
编辑:有什么好的在线文章讨论这个特定主题吗?我看到的一个缺点是,允许域对象调用服务可能会使序列化变得更困难,或者至少在序列化后,当另一方有人调用其服务方法时会导致一些问题.如果允许实体对象调用服务,则它将执行数据对象和服务对象两个角色。一般来说,每个对象不仅在实现上,而且在使用上都应该有责任 在您的例子中,低级用户图像似乎既是图像又是指纹识别器。这是: 不过,你可能会发现这本书很有趣 问题是。我对这个主题的感觉发生了波动,当逻辑应该进入领域对象时,我已经确定了以下条件:
- 逻辑应该是域逻辑,即不像image.load()或image.save()那样
- 逻辑不应该给对象多个在域中更改的“理由”。这是SRP的重新声明李>
- 逻辑不应该被强制到对象中。换言之,如果你最终做了什么,三思而后行
- 在Evans DDD的书中,一个帐户 实体有如下方法 贷方(金额)、借方(金额)、转账(账户、金额)和 Account(),但FundsTransferService具有转账(帐户、帐户、金额)方法。transferTo方法不调用任何服务,只处理涉及帐户的逻辑,如记入正确金额的贷方和借方 除了协调外,FundsTransferService还有自己的规则需要检查,这些规则不适合账户。贷记或借记的确切金额可能涉及外部各方。这使得transferTo很难呼叫该服务
- 对于像UserImage这样的简单对象,能够适合对象本身的重要域逻辑可能很少,因为据我所知,它不是聚合。我认为,聚合更多地提供了一个容纳域逻辑的机会。帐户示例可能是一个聚合