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

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

作者头像
用户1910585
发布2018-05-11 15:35:01
6690
发布2018-05-11 15:35:01
举报
文章被收录于专栏:领域驱动设计DDD实战进阶

上篇文章主要讲述了经销商上下文的需求与POCO对象,这篇文章主要讲述该界限上下文的仓储与领域逻辑的实现。

关于界限上下文与EF Core数据访问上下文参考产品上下文相应的实现,这里不再累述。

因为在经销商上下文中有两个聚合,一个是经销商聚合,一个是登录聚合,所以我们需要实现两个仓储接口:

1.经销商仓储接口定义:

代码语言:javascript
复制
 public interface IDealerRepository
    {
        void CreateDealer<T>(T dealer) where T : class, IAggregationRoot;
        //获取上级经销商(当前代注册经销商)的层次结构
        int GetParentDealerLayer(Guid dealerid);
        //将上级经销商(代注册经销商)的子个数加一
        void AddParentSubCount(Guid? parentdealerid);
        //减去父进销商的电子币(用于注册和下单时,扣减经销商的电子币)
        void SubParentEleMoney(Guid parentdealerid, decimal subelemoney);
        //下订单时,增加经销商的PV
        void AddDealerPV(Guid dealerid, decimal orderpv);

    }

2.登录仓储接口定义:

代码语言:javascript
复制
 public interface ILoginRepository
    {
        void CreateLogin<T>(T login) where T : class, IAggregationRoot;
        Guid UserLogin(string tel, string password);
    }

3.具体对应的仓储实现在仓储实现的项目中自己实现,主要通过EF Core完成数据库的访问与操作。

4.经销商聚合中联系人对象的领域逻辑实现:

代码语言:javascript
复制
public partial class Contact
    {
        public Contact CreateContact(Guid dealerid,string name,string tel,string province,string city,
            string zero,string street,int isdefault)
        {
            this.Id = Guid.NewGuid();
            this.DealerId = dealerid;
            this.ContactName = name;
            this.ContactTel = tel;
            this.Province = province;
            this.City = city;
            this.Zero = zero;
            this.Street = street;
            switch (isdefault)
            {
                case 1:this.IsDefault = IsDefaultContact.默认;
                    break;
                case 2:this.IsDefault = IsDefaultContact.非默认;
                    break;
            }
            return this;

        }
    }

5.经销商聚合中经销商层次结构对象的领域逻辑实现:

代码语言:javascript
复制
 public partial class DealerTree
    {
        private readonly IDealerRepository idealerrepository;
        public DealerTree(IDealerRepository idealerrepository)
        {
            this.idealerrepository = idealerrepository;
        }
        public DealerTree CreateDealerTree(Guid? parentdealerid,Guid dealerid)
        {
            this.Id = Guid.NewGuid();
            this.DealerId = dealerid;
            this.ParentDealerId = parentdealerid;
            this.Layer = parentdealerid == null ? 1 : idealerrepository.GetParentDealerLayer(Guid.Parse(parentdealerid.ToString())) + 1;
            return this;
        }
    }

6.经销商聚合中经销商对象的领域逻辑实现:

代码语言:javascript
复制
 public partial class Dealers
    {
        private readonly IDealerRepository idealerrepository;
        public Dealers(IDealerRepository idealerrepository)
        {
            this.idealerrepository = idealerrepository;
        }
        public Dealers RegisterDealer(Guid id,string name,string tel,decimal telmoney,List<Contact>
            contacts,Guid? parentid)
        {
            this.Id = id;
            this.Code = "Code " + name;
            this.Name = name;
            this.Tel = tel;
            this.TotalEleMoney = telmoney;
            if (telmoney < 2000)
            {
                this.CardType = CardType.普通会员;
            }
            else if (telmoney >= 2000 && telmoney < 4000)
            {
                this.CardType = CardType.银卡会员;
            }
            else
            {
                this.CardType = CardType.金卡会员;
            }
            this.SubCount = 0;
            this.TotalPV = 0;
            this.JiangJInMoney = 0;
            this.Contacts = contacts;
            this.DealerTree = new DealerTree(idealerrepository).CreateDealerTree(parentid, id);
            return this;
        }
    }

7.登录聚合中登录对象的领域逻辑实现:

代码语言:javascript
复制
 public partial class Login
    {
        public Login CreateLogin(string code,Guid dealerid)
        {
            this.Id = Guid.NewGuid();
            //手机号
            this.Code = code;
            //默认初始密码
            this.Password=MD5Encrption.GetMd5Str("111111");
            this.DealerId = dealerid;
            return this;
        }
    }

这样,我们就完成了基本数据库的访问、操作和相关领域逻辑的实现。

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

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

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

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

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