在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对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. 1179: 零起点学算法86——小明A+B(未弄懂)

    1179: 零起点学算法86——小明A+B Time Limit: 1 Sec  Memory Limit: 32 MB   64bit IO Format: %lldSubmitted: 2540  ...

  2. javascript_01

  3. Java WebService 简单实例使用JDK

    原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/22/2296052.html     什么是WebServices? 它是一种构建应用程序的普 ...

  4. Machine learning | 机器学习中的范数正则化

    目录 1. \(l_0\)范数和\(l_1\)范数 2. \(l_2\)范数 3. 核范数(nuclear norm) 参考文献 使用正则化有两大目标: 抑制过拟合: 将先验知识融入学习过程,比如稀疏 ...

  5. search

    |—search()—|—添加一个列表变量Expend,存储每个小格扩展时为第几步,可打印出 |                    |—打印运动表 |—A*—|— heuristic() |—Dy ...

  6. [转].NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别

    转至:https://segmentfault.com/a/1190000011539920 前段时日微软(Microsoft)正式发布了.NET Core 2.0,在很多开发社区中反响不错.但还是有 ...

  7. latex 常用自定义_随时更新

    1.向量定义 代码: \newcommand{\vector}[1]{${#1}_1,{#1}_2,\cdots,{#1}_n$} 效果: a1,a2,...,an

  8. Gitee(码云)、Github同时配置ssh key

    一.cd ~/.ssh 二.通过下面的命令,依次生成两个平台的key $ ssh-keygen -t rsa -C "xxxxxxx@qq.com" -f "github ...

  9. 简单了解Django

    Django 是开源代码web应用的框架,由python完成,django的主要目的是简便,快速开发数据库驱动网站 主要用于测试,运维,自测. 1.下载Django. 个人建议使用命令pip inst ...

  10. Exp2 后门原理与实践-------20164325王晓蕊

    Exp2 后门原理与实践 任务一:使用netcat获取主机操作Shell,cron启动 1.windows获取linux shell 1.1 ipconfig  查看本机查看以太网适配器(8)的ipv ...