Domain driven design 关于实体的综合问题

Domain driven design 关于实体的综合问题,domain-driven-design,Domain Driven Design,我有两个实体发布者和推荐者。报价有效期仅为两个月。出版商带来另一个人作为雷菲拉尔得到的钱描述了该报价。一个出版商可以带尽可能多的人来为一个特定的报价。在一段时间后,要约到期并生成新要约 1)现在的问题是Publisher是我的根聚合,但refferaloffer是Publisher聚合的一部分吗。或者refferaloffer是单独的骨料 2) Is refferaloffer是值对象 3) 我如何创建可以维护referedto和refeeredBy的类。我读过关于推荐营销的文章,但这还不足以让

我有两个实体发布者和推荐者。报价有效期仅为两个月。出版商带来另一个人作为雷菲拉尔得到的钱描述了该报价。一个出版商可以带尽可能多的人来为一个特定的报价。在一段时间后,要约到期并生成新要约

1)现在的问题是Publisher是我的根聚合,但refferaloffer是Publisher聚合的一部分吗。或者refferaloffer是单独的骨料

2) Is refferaloffer是值对象

3) 我如何创建可以维护referedto和refeeredBy的类。

我读过关于推荐营销的文章,但这还不足以让我了解您的业务

  • 在你的情况下,推荐服务是什么
  • 你想解决什么样的问题?你申请的目的是什么
  • 推荐服务是针对出版商的吗
  • 一个以上的出版商能否为一个特定的推荐服务带来人员

  • 将尝试在代码中反映一些想法

    请记住,我对商业领域知之甚少

    省略/忽略大量的细节(例如,可能出现的技术困难,甚至与领域相关的事情,例如,当转介成为出版商时)

    但希望-这可能会给你一些想法

     public class Publisher:Root{}
    
    /*
     I believe it's a root, because multiple publishers can
     bring referrals to one particular referral offer
    
     it could be modeled as entity if offers were given for
     publishers individually
    
     it's certainly not a value object, because we care about identity
     of particular offer disregarding it's state.
    
     I'm ignoring possibility that there might be various incentives
     with common structure/behavior
    */
    public class ReferralOffer:Root{
     public bool IsActive(){ 
      return _startedOn.AddMonths(-_lengthInMonths)>DateTime.Now;
     }
     public void BringReferral(string referralName, Publisher boughtBy){
      if (IsActive()) _referrals.Add(new Referral(referralName,boughtBy));
     }
     private List<Referral> _referrals;
     public void SendBucksToLuckyBastards(IMoneyTransferService mts){
      if (!IsActive()&&!_awardsSent){
        _referrals.SelectMany(r=>r.BoughtBy)
         .ForEach(p=>mts.SendToPublisher(p,_award));
        _awardsSent=true;
       }
     }
     public ReferralOffer(Money award, int lengthInMonths){
      _award=award;
      _lengthInMonths=lengthInMonths;
      _startedOn=DateTime.Now;
     }
     //assuming it's amount for each referral and not total
     private Money _award;
     private int _lengthInMonths;
     private DateTime _startedOn;
     private bool _awardsSent;
    }
    
    /*
     referral - person who is bought by publisher and who eventually
     might become a publisher
    
     if referral automatically becomes a publisher - likely this should
     be modeled otherwise
    
     entity, because it makes no sense w/o referral offer
    */
    public class Referral:Entity{ 
     public Publisher BoughtBy{get; private set;}
     public string Name{get; private set;}
     //internal, because only offer constructs them
     internal Referral(string name,Publisher boughtBy){
      BoughtBy=boughtBy;
      Name=name;
     }
    }
    
    var me=publisherRepository.ByFullName("Arnis Lapsa");
    var offer=new ReferralOffer(200,2);
    offer.BringReferral(me, "kamal");
    //two months later
    offer.SendBucksToLuckyBastards(moneyTransferService);
    
    公共类发布者:根{}
    /*
    我相信这是一个根,因为多个出版商可以
    将转介带到一个特定的转介服务
    如果为其提供报价,则可以将其建模为实体
    个别出版商
    它当然不是一个价值对象,因为我们关心身份
    不考虑其状态的特殊报价。
    我忽略了可能存在各种激励的可能性
    具有共同的结构/行为
    */
    公共类ReferralOffer:Root{
    公共bool IsActive(){
    返回_startedOn.AddMonths(-u lengthInMonths)>DateTime.Now;
    }
    public void bringerferral(字符串referralName,Publisher boughtBy){
    if(IsActive())\u referrals.Add(新的referrals(referrralname,boughtBy));
    }
    私人名单(转介);;
    公共无效SendBucksToLuckyBastards(IMoneyTransferService mts){
    如果(!IsActive()&&!\u获奖者){
    _推荐。SelectMany(r=>r.BoughtBy)
    .ForEach(p=>mts.sendtoppublisher(p,_奖));
    _awardsSent=true;
    }
    }
    公开推荐(金钱奖励,国际长度月){
    _奖励=奖励;
    _Lengthinnmoths=Lengthinnmoths;
    _startedOn=DateTime.Now;
    }
    //假设它是每次转诊的金额,而不是总数
    私人资金奖;
    私人国际长途列车;
    私人日期时间(private DateTime)开始;;
    私人博物馆奖;
    }
    /*
    推荐-被出版商购买并最终
    可能成为出版商
    如果引用自动成为发布者-很可能应该
    以其他方式建模
    实体,因为不提供转介服务是没有意义的
    */
    公共类引用:实体{
    公共发布服务器BoughtBy{get;private set;}
    公共字符串名称{get;private set;}
    //内部,因为只有提供构造它们
    内部引用(字符串名称、发布者boughtBy){
    布格比=布格比;
    名称=名称;
    }
    }
    var me=publisherRepository.ByFullName(“Arnis Lapsa”);
    var报价=新的参考报价(200,2);
    布林格费拉尔(我叫卡马尔);
    //两个月后
    offer.SendBucksToLuckyBastards(汇款服务);
    
    请记住-此代码只是为了帮助您。这一点都不好

    尽量彻底理解代码,并查看每行代码的含义


    p.s.一如既往欢迎批评

    Refferal的提议就像,如果出版商在我们的网站上购买任何人作为出版商,我们会给予他奖励。要约通常包含给购买另一人的人的金额。Refferal优惠不是特定于出版商的,优惠有效期为一段时间,若一个人带来另一个人,他将根据优惠获得资金。几天后,要约被解除,并生成新要约。在publisher上,可以将任意数量的os人员作为publisher。我无法将出版商和报价之间的关系联系起来。我是作为单独的实体创建报价,还是制作出版商的vo?我指的是它包含的内容。发布者将有一个列表。公共无效发送BuckstoLuckyBastards(IMoneyTransferService mts)。我想知道你们如何在域中使用服务。@kamal它可能是vo。当然不是根。如有必要,您可以通过referralOffer检索发布者推荐。我使用的是服务领域的抽象——领域本身包含了金钱可以转移的知识,而不知道如何在技术上真正做到这一点。不管怎样,这段代码只是给人一些想法。@Arnis你认为SocialOffer是根agg,refferal是VO吗?