在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对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. C#读取word内容实践

    C#读取word文档是如何实现的呢?我们可以使用FileStream对象来把文本文件里面的信息读取出来,但是对于word文档来说就不能使用这样的方法了. 这种情况下C#读取word文档的实现我们需要使 ...

  2. Maven引入自定义jar包

    1.将项目打成jar包  或者下载某个jar包  放在某个目录下(随便吧,桌面也行),这里是放在F:/  jar包为 alipay.jar 2.给jar包取个名字   用原名也行(maven打包默认会 ...

  3. django学习,session与cookie

    Cookies,某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明.Cook ...

  4. vue工程按业务路由打包,页面只加载对应资源

    修改路由表:src/router/index.js import Vue from 'vue'; import Router from 'vue-router'; // 主要写法如下 const Te ...

  5. 利用jsonp调用外部ip地址池

    <html lang="en"> <head> <meta charset="UTF-8"> <title>Do ...

  6. Redis Sentinel 配置文件

    基础参考:https://www.cnblogs.com/wang-li/p/9955303.html 配置文件讲解 1.sentinel monitor # sentinel monitor < ...

  7. Runtime "Apache Tomcat v6.0 (3)" is invalid. The JRE could not be found. Edit the server and change the JRE location解决方案

    使用eclipse,启动Tomcat时出现The JRE could not be found ,Edit server and change teh JRE location的错误提示! 原因:重装 ...

  8. 使用django我的第一个简单项目流程

    项目概述:本项目实现的是员工提交需要审批的事情给老板(例如请假事件.某些具体事务需要老板确认事件等),老板确认或者拒绝该事件,员工登录员工自己的页面可以查询响应的状态信息. 代码实现概略:需要创建两个 ...

  9. idea jetty 配置

    一.jetty 网址下载地:https://www.eclipse.org/jetty/ 1.如下图红色箭头--> 点击Downloads 下载 2.选择最新版 .ZIP 下载 3.选择安装路径 ...

  10. mac上terminal_问题_1117

    (1)安装Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install ...