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