技术成就梦想

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



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

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

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

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

 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.登录仓储接口定义:

 public interface ILoginRepository
    {
        void CreateLogin<T>(T login) where T : class, IAggregationRoot;
        Guid UserLogin(string tel, string password);
    }

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

 

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

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.经销商聚合中经销商层次结构对象的领域逻辑实现:

 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.经销商聚合中经销商对象的领域逻辑实现:

 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.登录聚合中登录对象的领域逻辑实现:

 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;
        }
    }

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

 

QQ讨论群:309287205

DDD实战进阶视频请关注微信公众号: