2010-12-12 83 views
0

我有兩個實體Publisher和ReferralOffer。報價僅在2個月內有效。將另一個人作爲Refferal的發佈商獲得了爲該報價進行了描述的資金。一個出版商可以爲儘可能多的人提供特定優惠。經過一段時間後,該優惠到期併產生新的優惠。關於實體的聚合問題

1)現在問題是發佈者是我的根聚合,但是refferaloffer是發佈者聚合的一部分。或refferaloffer是單獨的聚合。

2)refferaloffer是價值對象。

3)我如何創建類refferedTo和refeeredBy可以維護。

回答

1

我讀wiki article有關推介營銷,但這不足以讓我瞭解您的業務。

  1. 什麼是您的案例推薦優惠?
  2. 你正試圖解決什麼樣的問題?您的應用程序的目標?
  3. 是推介提供發佈商特定?
  4. 多個發佈商可以爲某個特定推介優惠帶來哪些人員?

將嘗試以反映代碼的一些想法。

請記住 - 我對商業領域知之甚少。

忽略/忽略巨大詳細信息的數量(例如可能出現的技術困難,甚至與推介成爲發佈商時的域相關的事情)。

但希望 - 這可能會給你一些想法。

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

請記住 - 此代碼僅用於幫助您。這遠非好事。

嘗試徹底理解代碼,並且參見影響每行代碼都會產生。

附:批評是一如既往的歡迎

+0

Refferal優惠就像我們給出版商的獎勵,如果他在我們的網站上以出版商身份購買任何人。優惠通常包含給予購買他人的人一些錢。 Refferal優惠不是特定的發佈商,如果某人根據優惠邀請另一個人獲得款項,則該優惠有效期爲一段時間。幾天後,報價解散併產生新的報價。發佈者可以將任何數字os人員作爲發佈者。我無法將發佈商和優惠之間的關聯關聯起來。我是否以單獨的實體創建報價或發佈發佈商 – kamal 2010-12-14 20:14:35

+0

@kamal更新了我的回答 – 2010-12-14 21:57:57

+0

RefferalOFFer中的Refferal是什麼,我指的是它包含的內容。發佈商是否有列表。 public void SendBucksToLuckyBastards(IMoneyTransferService mts)。我想知道如何在域中使用服務。 – kamal 2010-12-16 19:40:21