关于ABP——领域服务的思考

我在刚接触ABP的时候一直有一个疑问——有了应用服务,为什么还需要领域服务呢?

领域服务和应用服务对比

领域服务应用服务
返回值EntityDTO
被表现层调用不可以(非强制)可以

在ABP里面不是强制要使用领域服务的,但使用领域服务是个比较好的实践。

什么时候使用领域服务?

  1. 处理的是业务,而非场景(use-case)
  2. 要对Entity的状态修改加限制
举例
  • 栗子 电商的商品扣除库存
    假设我们写在应用层
    定义以下应用服务:

     public interface IStockApplication
     {
         ...
         bool Reduce(ProductDto product, int qty);
     }
     public interface IOrderApplication
     {
         ...
         void Submit(OrderDto order);
     } 
    可能会造成的问题:
  1. 扣库存这个业务就会暴露给表现层,造成表现层可能出现直接调用的情况,这是应该避免的。
  2. 开发Submit方法的技术人员不知道IStockApplication.Reduce,而是直接操作Product实体

解决问题:
将Product实体的Stock属性设置为只读,定义领域服务

public class Product
{
    ...
    //库存
    public int Stock{get; protected set;}

    //保留库存
    public int RetainStock{get;set;}

    internal bool Reduce(int qty)
    {
        //检查库存
        if(RetainStock > Stock-qty)
            return false;
        Stock-=qty;
    }
}
 public interface IStockDoman
 {
     ...
     bool Reduce(ProductDto product, int qty);
 }
 public class StockDoman:IStockDoman
 {
    ...
     bool Reduce(Product product, int qty)
    {
        ...
        product.Reduce(qty);
        ...
        return true;
    }
 }
 public interface IOrderApplication
 {
     ...
     void Submit(OrderDto order);
 } 

这样就有效的避免了上述问题

转载于:https://www.cnblogs.com/sheepswallow/p/6283484.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值