領域驅動設計實戰案例(六):訂單上下文領域邏輯

DDD實戰進階第一波:開發一般業務的大健康行業直銷系統

前一篇文章主要講了訂單上下文的POCO模型,其中訂單與訂單項中有大量的值對象。這篇文章主要講講這些值對象以及訂單項、訂單相關的領域邏輯。

1.ProductSKUs值對象領域邏輯:

ProductSKUs值對象用於訂單項實體中,它的信息應該來源於產品上下文的ProductSKU實體。

public partial class ProductSKUs

{
    public ProductSKUs() { }
    public ProductSKUs CreateProductSKUs(ProductSKU productsku)
    {
        this.ProductSPUName = productsku.ProductSPUName;
        this.ProductPrice = productsku.DealerPrice;
        this.ProductPV = productsku.PV;
        this.ProductSKUId = productsku.Id;
        return this;
    }
}

2.OrderItemTotalPV值對象領域邏輯:

OrderItemTotalPV值對象的領域邏輯主要是通過訂單項購買的ProductSKU的PV與數量計算出這個訂單項的總PV值。

public partial class OrderItemTotalPV

{
    public OrderItemTotalPV() { }
    public OrderItemTotalPV CreateOrderItemTotalPV(ProductSKU productsku,int count)
    {
        this.SubTotalPV = productsku.PV * count;
        return this;
    }
}

3.OrderItemTotalPrice值對象領域邏輯:

OrderItemTotalPrice值對象的領域邏輯主要是通過訂單項購買的ProductSKU的單價與數量計算出這個訂單項的總價。

public partial class OrderItemTotalPrice

{
    public OrderItemTotalPrice() { }
    public OrderItemTotalPrice CreateOrderItemTotalPrice(ProductSKU productsku,int count)
    {
        this.SubTotalPrice = productsku.DealerPrice * count;
        return this;
    }
}

4.OrderItem實體的領域邏輯:

OrderItem實體的領域邏輯主要包含兩個方面,一個是OrderItem的Code生成規則,二是調用自身包含的上述三個值對象領域邏輯,生成相關的值對象。

public partial class OrderItem

{
    public OrderItem() { }
    public OrderItem CreateOrderItem(ProductSKU productsku,int count)
    {
        this.Id = Guid.NewGuid();
        this.Code = "OrderItem " + DateTime.Now.ToString();
        this.Count = count;

        this.OrderItemTotalPrice = new OrderItemTotalPrice().CreateOrderItemTotalPrice(productsku,
            count);
        this.OrderItemTotalPV = new OrderItemTotalPV().CreateOrderItemTotalPV(productsku,
            count);
        this.ProductSKUs = new ProductSKUs().CreateProductSKUs(productsku);
        return this;
    }
}

5.OrderStreet值對象領域邏輯:

OrderStreet值對象的信息主要由產品購買時,確定的聯繫人信息將相關的屬性賦值給OrderStreet值對象。

public partial class OrderStreet

{
    public OrderStreet() { }
    public OrderStreet CreateOrderStreet(Contact contact)
    {
        this.Privince = contact.Province;
        this.City = contact.City;
        this.Zero = contact.Zero;
        this.Street = contact.Street;
        return this;
    }
}

6.OrderTotalPV值對象領域邏輯:

OrderTotalPV值對象的值由每個訂單項的OrderItemTotalPV值對象累加起來。

public partial class OrderTotalPV

{
    public OrderTotalPV() { }
    public OrderTotalPV CreateOrderTotalPV(List<OrderItemTotalPV> itemtotalpvs)
    {
        var ordertotalpv = 0.00M;
        itemtotalpvs.ForEach(p =>
        {
            ordertotalpv += p.SubTotalPV;
        });
        this.TotalPV = ordertotalpv;
        return this;
    }
}

7.OrderTotalPrice值對象領域邏輯:

OrderTotalPrice值對象的值由每個訂單項的OrderItemTotalPrice值對象累加起來。

public partial class OrderTotalPrice

{
    public OrderTotalPrice() { }
    public OrderTotalPrice CreateOrderTotalPrice(List<OrderItemTotalPrice> itemtotalprices)
    {
        var ordertotalprice = 0.00M;
        itemtotalprices.ForEach(p =>
        {
            ordertotalprice += p.SubTotalPrice;
        });
        this.TotalPrice = ordertotalprice;
        return this;
    }
}

8.Orders聚合根領域邏輯:

Orders聚合根其實就是協調OrderItem實體、自身包含的3個值對象完成整個下單的領域邏輯。

public Orders CreateOrders(Guid id,Guid dealerid,List<ProductSKU> productskus,

        List<int> counts,Contact contact)
    {
        this.Id = id;
        this.OrderDealerId = dealerid;
        this.OrderDateTime = DateTime.Now;
        this.Telephone = contact.ContactTel;
        this.Code = "Order " + DateTime.Now.ToString();

        this.OrderStreet = new OrderStreet().CreateOrderStreet(contact);
        this.OrderItems = new List<OrderItem>();
        var orderitemtotalprices = new List<OrderItemTotalPrice>();
        var orderitemtotalpvs = new List<OrderItemTotalPV>();
        for(int i = 0; i < productskus.Count; i++)
        {
            var orderitem = new OrderItem().CreateOrderItem(productskus[i], counts[i]);
            this.OrderItems.Add(orderitem);
            orderitemtotalprices.Add(orderitem.OrderItemTotalPrice);
            orderitemtotalpvs.Add(orderitem.OrderItemTotalPV);
        }
        this.OrderTotalPrice = new OrderTotalPrice().CreateOrderTotalPrice(orderitemtotalprices);
        this.OrderTotalPV = new OrderTotalPV().CreateOrderTotalPV(orderitemtotalpvs);
        return this;
    }

QQ討論羣:309287205
DDD實戰進階視頻請關注微信公衆號:msshcj

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章