在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对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实战进阶视频请关注微信公众号:

DDD实战进阶第一波(十二):开发一般业务的大健康行业直销系统(订单上下文POCO模型)的更多相关文章

  1. DDD实战进阶第一波(十):开发一般业务的大健康行业直销系统(实现经销商登录仓储与逻辑)

    上一篇文章主要讲了经销商注册的仓储和领域逻辑的实现,我们先把应用服务协调完成经销商注册这部分暂停一下,后面文章统一讲. 这篇文章主要讲讲经销商登录的仓储和相关逻辑的实现. 在现代应用程序前后端分离的实 ...

  2. DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述)

    本系列文章 DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述) DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一) 近年来,关于如何开发基于 ...

  3. DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)

    了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的架构,只有了解了经典DDD的架构,你才能 ...

  4. DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)

    这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题. 大家都知道,聚合根.实体和值对象这些领域对象都自身处理自己的业务逻辑.在业务处理过 ...

  5. DDD实战进阶第一波(五):开发一般业务的大健康行业直销系统(实现产品上下文领域层)

    从这篇文章开始,我们根据前面的DDD理论与DDD框架的约束,正式进入直销系统案例的开发. 本篇文章主要讲产品上下文中的领域层的主要实现,先简单讲下业务方面的需求:产品SPU与产品SKU,产品SPU主要 ...

  6. DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)

    前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...

  7. DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发)

    前两篇文章主要实现了经销商代注册的仓储与领域逻辑.经销商登录的仓储与相关逻辑,这篇文章主要讲述经销商代注册的用例与经销商登录的查询功能. 一.经销商代注册用例 在经销商代注册用例中,我们需要传递经销商 ...

  8. DDD实战进阶第一波(十三):开发一般业务的大健康行业直销系统(订单上下文领域逻辑)

    前一篇文章主要讲了订单上下文的POCO模型,其中订单与订单项中有大量的值对象.这篇文章主要讲讲这些值对象以及订单项.订单相关的领域逻辑. 1.ProductSKUs值对象领域逻辑:ProductSKU ...

  9. DDD实战进阶第一波(九):开发一般业务的大健康行业直销系统(实现经销商上下文仓储与领域逻辑)

    上篇文章主要讲述了经销商上下文的需求与POCO对象,这篇文章主要讲述该界限上下文的仓储与领域逻辑的实现. 关于界限上下文与EF Core数据访问上下文参考产品上下文相应的实现,这里不再累述. 因为在经 ...

  10. DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)

    上一篇文章我们讲了经典DDD架构对比传统三层架构的优势,以及经典DDD架构每一层的职责后,本篇文章将介绍基础结构层中支持DDD的轻量级框架的主要代码. 这里需要说明的是,DDD轻量级框架能够体现DDD ...

随机推荐

  1. Jackson注解简介

    1.注解: @JsonInclude(JsonInclude.Include.NON_NULL) 1.如果放在属性上,如果该属性为NULL则不参与序列化 ;2.如果放在类上,那对这个类的全部属性起作用 ...

  2. 行盒(line box)垂直方向的属性详解:从font-size、line-height到vertical-align

    视觉格式化模型 在一个文档中,每个元素都被表示为0.1或多个矩形的盒子.确定这些盒子的尺寸, 属性 --- 像它的颜色,背景,边框方面 --- 和位置是渲染引擎的目标.① 在CSS中,使用标准盒模型描 ...

  3. 本地iis新建站点步骤

    例如:1.在C:\Windows\System32\drivers\etc\hosts下添加地址 2.在下面IIS加上名称与webUI的地址

  4. Game Theory

    HDU 5795 || 3032 把x个石子的堆分成非空两(i, j)或三堆(i, j, k)的操作->(sg[i] ^ sg[j])或(sg[i] ^ sg[j] ^ sg[k])是x的后继 ...

  5. 找出数组中最大值and索引

    找出数组中的最大值和和最大值的索引位置..... 第一中方法: /** * 找出数组中最大值和最大值的索引 * @param args */ public static void main(Strin ...

  6. 【翻译】Flume 1.8.0 User Guide(用户指南) Channel

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  7. Linux学习---自定义数据类型

    struct   结构体 (地址递增) eg:struct myabc{ unsigned int a; unsigned int b; unsigned int c; unsigned int d; ...

  8. mysql thread pool

    转自:http://blog.csdn.net/wyzxg/article/details/8258033 mysql 线程处理流程图: Mysql支持单线程和多线程两种连接线程模式,如果单线程,则在 ...

  9. Redis sentinel之集群搭建

    环境 由于不太熟悉docker,所以,把docker当虚拟机来用,服务器环境如下: Redis Server 环境搭建 Redis Server 01 搭建 并且制作Redis镜像 容器建立 # do ...

  10. window下载android 最新源码

    https://blog.csdn.net/jason0539/article/details/24010633 2017方法 ok https://www.cnblogs.com/zhangting ...