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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    用户1910585
  • DDD实战进阶第一波(十三):开发一般业务的大健康行业直销系统(订单上下文领域逻辑)

    用户1910585
  • DDD实战进阶第一波(五):开发一般业务的大健康行业直销系统(实现产品上下文领域层)

    从这篇文章开始,我们根据前面的DDD理论与DDD框架的约束,正式进入直销系统案例的开发。 本篇文章主要讲产品上下文中的领域层的主要实现,先简单讲下业务方面的需求...

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

    用户1910585
  • React 深入系列5:事件处理

    iKcamp
  • 聊聊spring cloud的consulRetryInterceptor

    本文主要研究一下spring cloud的consulRetryInterceptor

    codecraft
  • 如何从JavaScript跨越到TypeScript [基础进阶知识点]

    一致,都会导致报错。 建议使用npm 全局安装typeScript 然后使用 tsc *.ts 进行编译TS文件

    Peter谭金杰
  • 虚拟存储管理器的页面调度

    请求分页式存储管理:每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存;如果该页不在主存且内存块未满,则调入该页;如果该页不在主存...

    AI那点小事
  • Winform窗口里的嵌入WPF的UserControl,关闭Winform父窗体的方法

    可以在form_load事件里把this传给UserControl,然后在usercontrol里调用form的各种方法,不过这种做法不太好,耦合性较高。标准做...

    hbbliyong
  • 一句代码实现批量数据绑定[下篇]

    《上篇》主要介绍如何通过DataBinder实现批量的数据绑定,以及如何解决常见的数据绑定问题,比如数据的格式化。接下来,我们主要来谈谈DataBinder的设...

    蒋金楠

扫码关注云+社区

领取腾讯云代金券