从这篇文章开始, 我们开始介绍大健康行业直销系统领域层的实现.
先简单讲下业务方面的需求: 直销系统会有一个顶级的经销商, 经销商的基本信息中包括经销商的名字, 联系人(因为在平台购买产品后, 会寄送给联系人), 总的电子币(电子币是由经销商支付产生,
购买产品后会扣减电子币), 总的奖金币(系统周期性根据经销商购买的东西来确定奖金币, 奖金币可以购买东西, 也可以提现), 总 PV(经销商购买时, 会根据购买产品的 PV 进行累加), 卡的类型(根据经销商初次的电子币确定卡的类型), 子经销商个数(子经销商的注册由父经销商进行, 父经销商的直接子经销商不超过 2 个), 级别(根据周期消费总额确定经销商级别); 另外经销商有个层级结构,
最后系统当然还要对应经销商的登录信息, 默认系统会有个登陆密码; 经销商在注册子经销商时, 会从自己扣除一部分电子币附加到子经销商上.
从整个需求的理解并通过对 DDD 理解来看, 我们会有两个聚合, 分别是经销商聚合 (包括经销商, 联系人, 层级) 和登陆聚合.
1. 经销商聚合根:
- 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. 联系人值对象:
- 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. 层次结构值对象:
- 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. 登录聚合根:
- 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 个.
来源: https://www.cnblogs.com/malaoko/p/8979429.html