前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(实现经销商上下文领域层之POCO模型)

DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(实现经销商上下文领域层之POCO模型)

作者头像
用户1910585
发布2018-07-04 15:08:49
3370
发布2018-07-04 15:08:49
举报

从这篇文章开始,我们开始介绍大健康行业直销系统领域层的实现。

先简单讲下业务方面的需求:直销系统会有一个顶级的经销商,经销商的基本信息中包括经销商的名字、联系人(因为在平台购买产品后,会寄送给联系人)、总的电子币(电子币是由经销商支付产生,

购买产品后会扣减电子币)、总的奖金币(系统周期性根据经销商购买的东西来确定奖金币,奖金币可以购买东西,也可以提现)、总PV(经销商购买时,会根据购买产品的PV进行累加)、卡的类型(根据经销商初次的电子币确定卡的类型)、子经销商个数(子经销商的注册由父经销商进行,父经销商的直接子经销商不超过2个)、级别(根据周期消费总额确定经销商级别);另外经销商有个层级结构,

最后系统当然还要对应经销商的登录信息,默认系统会有个登陆密码;经销商在注册子经销商时,会从自己扣除一部分电子币附加到子经销商上。

从整个需求的理解并通过对DDD理解来看,我们会有两个聚合,分别是经销商聚合(包括经销商、联系人、层级)和登陆聚合。

1.经销商聚合根:

代码语言:javascript
复制
 public partial class Dealers:IAggregationRoot
    {
        public Dealers() { }

        public string Code { get; set; }
        [Key]
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Tel { get; set; }
        public decimal TotalEleMoney { get; set; }
        public decimal JiangJInMoney { get; set; }
        public decimal TotalPV { get; set; }
        public CardType CardType { get; set; }
        public Level Level { get; set; }
        public int SubCount { get; set; }
        public List<Contact> Contacts { get; set; }
        public DealerTree DealerTree { get; set; }
    }

    public enum CardType : int
    {
        普通会员=1,
        银卡会员=2,
        金卡会员=3
    }
    public enum Level : int
    {
        片区经理=1,
        省区经理=2,
        大区经理=3,
        董事=4
    }

2.联系人值对象:

代码语言:javascript
复制
 public partial class Contact : IValueObject
    {
        public Contact() { }
        public Guid Id { get; set; }
        public string ContactName { get; set; }
        public string ContactTel { get; set; }
        public string Province { get; set; }
        public string City { get; set; }
        public string Zero { get; set; }
        public string Street { get; set; }
        public IsDefaultContact IsDefault { get; set; }
    }
    public enum IsDefaultContact : int
    {
        默认=1,
        非默认=2
    }

3.层次结构值对象:

代码语言:javascript
复制
public partial class DealerTree : IValueObject
    {
        public DealerTree() { }
        public Guid Id { get; set; }
        public Guid DealerId { get; set; }
        public Guid? ParentDealerId { get; set; }
        public int Layer { get; set; }
    }

从经销商聚合大家可以看到,在创建一个经销商时,除了有经销商的基本信息外,还必须同时创建联系人与层次结构,这样一个经销商才是完整的,而且经销商也引用到了联系人与层次结构。

4.登录聚合根:

代码语言:javascript
复制
 public partial class Login : IAggregationRoot
    {
        public Login() { }
        //代表登录的电话号码
        public string Code { get; set; }
        public string Password { get; set; }
        public Guid DealerId { get; set; }
        [Key]
        public Guid Id { get ; set ; }
    }

4.处理经销商界限上下文与数据访问上下文的映射

关于如何讲经销商界限上下文映射到数据访问上下文,请参考产品上下文的相关实现,这里就不再累述了。

下一篇文章开始讲经销商上下文仓储的实现,因为在注册子经销商的领域逻辑中,会通过仓储去判断当前经销商是否子经销商个数超过2个。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档