博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DDD实战进阶第一波(十二):开发一般业务的大健康行业直销系统(订单上下文POCO模型)...
阅读量:5036 次
发布时间:2019-06-12

本文共 3772 字,大约阅读时间需要 12 分钟。

原文:

在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对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
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
Order { get; set; } public DbSet
OrderItem { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionBuilder) { optionBuilder.UseSqlServer("数据库连接字符串"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity
().OwnsOne(p => p.OrderStreet); modelBuilder.Entity
().OwnsOne(p => p.OrderTotalPrice); modelBuilder.Entity
().OwnsOne(p => p.OrderTotalPV); modelBuilder.Entity
().OwnsOne(p => p.OrderItemTotalPrice); modelBuilder.Entity
().OwnsOne(p => p.OrderItemTotalPV); modelBuilder.Entity
().OwnsOne(p => p.ProductSKUs); }

从上面代码可以看出,在OnModelCreating时,可以指定6个值对象包含在对应的聚合根和实体相关的表中。

 

QQ讨论群:309287205 

DDD实战进阶视频请关注微信公众号:

 

posted on
2019-05-21 23:49 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10903331.html

你可能感兴趣的文章
手把手教你写DI_1_DI框架有什么?
查看>>
.net常见的一些面试题
查看>>
OGRE 源码编译方法
查看>>
上周热点回顾(10.20-10.26)
查看>>
C#正则表达式引发的CPU跑高问题以及解决方法
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了...
查看>>
APScheduler调度器
查看>>
设计模式——原型模式
查看>>
【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
查看>>
如何一个pdf文件拆分为若干个pdf文件
查看>>
web.xml中listener、 filter、servlet 加载顺序及其详解
查看>>
前端chrome浏览器调试总结
查看>>
获取手机验证码修改
查看>>
数据库连接
查看>>
python中数据的变量和字符串的常用使用方法
查看>>
等价类划分进阶篇
查看>>
delphi.指针.PChar
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
java 字符串转json,json转对象等等...
查看>>
极客前端部分题目收集【索引】
查看>>