zoukankan      html  css  js  c++  java
  • 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实战进阶视频请关注微信公众号:

  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/malaoko/p/9131868.html
Copyright © 2011-2022 走看看