- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于领域分析设计的架构规范 - 充血模型之Service
Entity与Service,相爱相宰
好,接上一篇。
既然接受order.cancel()这种模式,那么一个新的问题来了:
全部的命令操作都要变成这样子吗?那已经巨大的OrderService的代码,岂不是只是单纯挪了一个位置,放在Order里面了,除了上面所谓的可读性的优势,那还有什么用?
并不是,只是一部分放在实体类,其余的命令操作,照旧会接受一种Service来做。所以,我们必定需要一个可以清楚量化的规范,来确定这些行为该放在哪里:
假如一个命令操作,只修改了一个聚合对象内部的相关数据,那么,就归属给这个聚合?比如,订单取消这个行为,需要做的事情有:
订单形态标记为取消
订单变更记录插入一条,“订单取消”
依据我们之前的图可以晓得,这些修改操作,都在这个订单聚合内,很自然的归属给order
留意,我们反复强调了这里是“修改操作”,也就是说,假如需要我们在此操作期间,查询其他聚合的信息,只需不做修改,那就是允许的!就像下面这样:
@Entity
public class Order{
private OrderStatus status;
private String customerName;
private User orderCreator; //假定这里是下单用户,省略了many-to-one的配置
//...
public void cancel(){
//修改操作1:变更订单本身形态
status = OrderStatus.CANCELLED;
//查询用户信息,要记录到订单变更日志中,
//这里假如是Hibernate,会直接触发sql查找,假如换成其他如mybatis,则用对应的repository操作即可,总之,是一个纯查询
String userName = orderCreator.getUserName();
//修改操作2:添加一条订单形态变更信息,具体实现省略
createOrderTrack(OrderStatus.CANCELLED,userName);
}
}
然后,就要从另外一个角度来说了?假如一个命令操作,并且要求是一个完整的事务,修改了多个聚合的数据,那么,需要为这个行为建立一个 Service?而这个Service,不会是一个{领域名称}+Service,而是一个{具体动作}+Service,比如OrderPayService,订单领取,假定有如下动作:
订单形态改为领取中
商品库存对应扣减
用户若使用了优待券,则优待券标记为使用中 这几个操作,是要在一个完整的事务中的,所以我们写在一个Service中
@Transactional
public class OrderPayService{ //-----------(1)
@Autowired OrderRepository orderRepository; //-----------(2)
@Autowired CouponRepository couponRepository;
public String execute(Long orderId,Long couponId){
//暂不考虑前置形态检查
//订单属性变更
Order order = orderRepository.getById(orderId);
order.setStatus(OrderStatus.PAYING);
//商品库存扣减,按之前的假定,一个订单只对应一个商品
Prodect product = order.getProduct();
product.minusStock(order.getQuantity); //-----------(3)
//变更优待券形态
Coupon usingCoupon = couponRepository.getById(couponId);
usingCoupon.setStatus(CouponStatus.USING);
//去买卖中心猎取领取unikey
CreatePayResponse payResponse = payCenterApi.createPay(...各种参数...);
文档评论(0)