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實戰進階視頻請關注微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM