DDD实战进阶第一波:开发通常业务的大健康行业直销系统数据库
在本系列前面的文章中,咱们主要讨论了产品上下文与经销商上下文相关的实现,你们对DDD的方法与架构已经有了初步的了解。微信
可是在这两个界限上下文中,业务逻辑很简单,也没有用到更多的值对象的内容。从这篇文章开始,咱们来说讲订单界限上下文实现的内容,里面的业务逻辑相对复杂一些,并且有大量值对象的引入来进行逻辑的处理。架构
订单上下文的需求主要是生成相应的订单项,每一个订单项中有相关的订单产品和购买数量并生成订单项总额、订单项总PV,同时订单项总额和订单项总PV会累加到订单总额和订单总PV中,同时会根据订单总额扣减当前经销商的电子币,也会根据购买产品的PV,累加当前经销商的PV值。ssh
1.订单界限上下文的领域模型:ide
从上图的领域模型中,你们能够看出订单是聚合根,订单明细是聚合的实体;订单聚合根总有总价、总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