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实战进阶视频请关注微信公众号:

  • 相关阅读:
    剑指offer-替换空格
    Python replace方法并不改变原字符串
    退出循环break,在while、for、do...while、循环中使用break语句退出当前循环,直接执行后面的代码。
    do{}while()
    while循环
    for循环
    switch用法
    Javascript获取select下拉框选中的的值
    js关于a++ 与++a
    onload属性使用方法
  • 原文地址:https://www.cnblogs.com/malaoko/p/9131868.html
Copyright © 2011-2022 走看看