領域驅動設計實戰案例(五):訂單上下文POCO模型

DDD實戰進階第一波:開發通常業務的大健康行業直銷系統數據庫

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

可是在這兩個界限上下文中,業務邏輯很簡單,也沒有用到更多的值對象的內容。從這篇文章開始,咱們來說講訂單界限上下文實現的內容,裏面的業務邏輯相對複雜一些,並且有大量值對象的引入來進行邏輯的處理。架構

訂單上下文的需求主要是生成相應的訂單項,每一個訂單項中有相關的訂單產品和購買數量並生成訂單項總額、訂單項總PV,同時訂單項總額和訂單項總PV會累加到訂單總額和訂單總PV中,同時會根據訂單總額扣減當前經銷商的電子幣,也會根據購買產品的PV,累加當前經銷商的PV值。ssh

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

clipboard.png

從上圖的領域模型中,你們能夠看出訂單是聚合根,訂單明細是聚合的實體;訂單聚合根總有總價、總PV、收穫地址三個值對象,訂單明細實體有明細總價、明細總PV、產品信息三個值對象。ui

2.明細總價值對象:spa

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

3.明細總PV值對象:code

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

相關文章
相關標籤/搜索