DDD實戰進階第一波(十二):開發一般業務的大健康行業直銷系統(訂單上下文POCO模型)


在本系列前面的文章中,我們主要討論了產品上下文與經銷商上下文相關的實現,大家對DDD的方法與架構已經有了初步的了解。

但是在這兩個界限上下文中,業務邏輯很簡單,也沒有用到更多的值對象的內容。從這篇文章開始,我們來講講訂單界限上下文實現的內容,

里面的業務邏輯相對復雜一些,而且有大量值對象的引入來進行邏輯的處理。

訂單上下文的需求主要是生成相應的訂單項,每個訂單項中有相關的訂單產品和購買數量並生成訂單項總額、訂單項總PV,同時訂單項總額

和訂單項總PV會累加到訂單總額和訂單總PV中,同時會根據訂單總額扣減當前經銷商的電子幣,也會根據購買產品的PV,累加當前經銷商的PV值。

1.訂單界限上下文的領域模型:

從上圖的領域模型中,大家可以看出訂單是聚合根,訂單明細是聚合的實體;訂單聚合根總有總價、總PV、收獲地址三個值對象,訂單明細實體有

明細總價、明細總PV、產品信息三個值對象。

2.明細總價值對象:

    public partial class OrderItemTotalPrice
    {
        public decimal SubTotalPrice { get; set; }
    }

3.明細總PV值對象:

 public partial class OrderItemTotalPV
    {
        public decimal SubTotalPV { get; set; }
    }

4.產品信息值對象:

 public partial class ProductSKUs
    {
        public string ProductSPUName { get; set; }
        public decimal ProductPrice { get; set; }
        public decimal ProductPV { get; set; }
        public Guid ProductSKUId { get; set; }
    }

5.訂單明細實體:

 public partial class OrderItem : IEntity
    {
        public string Code { get; set; }
        [Key]
        public Guid Id { get ; set ; }

        public OrderItemTotalPrice OrderItemTotalPrice { get; set; }
        public OrderItemTotalPV OrderItemTotalPV { get; set; }
        public ProductSKUs ProductSKUs { get; set; }

        public int Count { get; set; }

    }

訂單明細實體引入了OrderItemTotalPrice、OrderItemTotalPV、ProductSKUs三個值對象,同時具有自己的Code與Count兩個屬性。

6.訂單總價對象:

 public partial class OrderTotalPrice
    {
        public decimal TotalPrice { get; set; }
    }

7.訂單總PV值對象:

 public partial class OrderTotalPV
    {
        public decimal TotalPV { get; set; }
    }

8.訂單收貨地址值對象:

 public partial class OrderStreet
    {
       //
        public string Privince { get; set; }
       //
        public string City { get; set; }
       //區(縣)
        public string Zero { get; set; }
       //街道地址
        public string Street { get; set; }
    }

9.訂單聚合根:

 public partial class Orders : IAggregationRoot
    {
        public string Code { get; set ; }
        [Key]
        public Guid Id { get ; set; }

        public OrderStreet OrderStreet { get; set; }
        public OrderTotalPV OrderTotalPV { get; set; }
        public OrderTotalPrice OrderTotalPrice { get; set; }
        public DateTime OrderDateTime { get; set; }
        public Guid OrderDealerId { get; set; }
        public List<OrderItem> OrderItems { get; set; }
        public string Telephone { get; set; }
    }

訂單聚合根引入了OrderStreet、OrderTotalPV、OrderTotalPrice三個值對象;Code、DateTime(下單時間)、Telephone(聯系電話)、OrderItems(訂單項實體集)等幾個屬性。

10.生成數據庫表:

根據前面文章的說明,我們可以依據上述POCO模型生成對應的數據庫表,要注意的是,OrderItems可以自動識別為Orders的關聯表,其他幾個值對象我們要考慮是否是生成

單獨的表還是作為相關實體或聚合根的表的列存在,一般情況下,我們是將這些值對象作為相關聚合根或實體表的列存在的。EF Core無法自動處理這些值對象如何存儲到數據庫中,

我們需要手工指定:

 public class OrderEFCoreContext:DbContext,IOrderContext
    {
        public DbSet<Orders> Order { get; set; }
        public DbSet<OrderItem> OrderItem { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder)
        {           

            optionBuilder.UseSqlServer("數據庫連接字符串");
           
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Orders>().OwnsOne(p => p.OrderStreet);
            modelBuilder.Entity<Orders>().OwnsOne(p => p.OrderTotalPrice);
            modelBuilder.Entity<Orders>().OwnsOne(p => p.OrderTotalPV);

            modelBuilder.Entity<OrderItem>().OwnsOne(p => p.OrderItemTotalPrice);
            modelBuilder.Entity<OrderItem>().OwnsOne(p => p.OrderItemTotalPV);
            modelBuilder.Entity<OrderItem>().OwnsOne(p => p.ProductSKUs);
        }

從上面代碼可以看出,在OnModelCreating時,可以指定6個值對象包含在對應的聚合根和實體相關的表中。

 

QQ討論群:309287205 

DDD實戰進階視頻請關注微信公眾號:

 


免責聲明!

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



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