2011-12-20 56 views
1

前言:剛開始學習DDD。DDD服務或實體模擬禮品卡金額減少

我在想我可以使用DDD模型的禮品卡示例。比如說我有一個禮品卡實體。在我的系統中,禮物卡的金額將需要減少或兌換。我會使用禮品卡服務對象來減少金額嗎?該服務將包括驗證入金額並確保新金額不超過餘額等。或者,這是否會作爲另一種方法生活在我的禮品卡實體上,然後將我更新的禮品卡對象傳遞給我的存儲庫以堅持下去?

public GiftCard 
{ 
    public int Id { get; set; } 
    public double Amount { get; set; } 
} 

public GifTCardService 
{ 
    public void ReduceAmount(GiftCard card, double amount) 
    { 
     // Validation checks to make sure amount can be removed. 
     // Call gift card repository to actually remove amount. 
    } 
} 

回答

1

開始你可能想要的屬性由只讀這樣Id和金額不能僅僅通過設置值發生改變。

接下來您需要一種方法來對禮品卡進行交易,這些交易將借方調整相應的金額。像

class GiftCard 
{ 
    public long Id {get; private set;} 
    public double Amount {get; private set;} 

    public void Apply(Transaction tx) 
    { 
     if(tx.Amount > Amount) 
     { 
      handle insufficient funds 
     } 
     else 
     { 
      Amount -= tx.Amount; 
      //other logic if necessary 
     } 
    } 
} 

請記住,這只是許多設計選項之一。

+0

上面這個禮品卡對象是否與我通過id找到時存儲庫返回的是相同的? – Frankie 2011-12-20 21:48:09

+0

是的,它可能是。 – 2011-12-20 21:54:34

+0

我認爲Frankie的意思是,如果他從數據庫中提取的對象與上面的對象相同......或者可能是同一個對象。我會說不。原因是因爲DDD中的這個對象(模型)完全不知道來自SQL,MYSQL,XML或任何你選擇持久化對象的東西。 – 2012-10-31 01:31:06

2

這只是我的看法,但在這種情況下,我傾向於把這個邏輯放在域對象上。我其實真的不開始使用服務,除非一些依賴將被引入到域模型,例如:

set user to registered, and send email using some sort of email sending service 

在這種情況下,我想有一個用戶註冊服務。

然而,在你的情況下,只要有足夠的智能域來驗證設置它自己的屬性,它將使生活變得容易很多。

再次,這只是我如何看待它。

希望這有助於

1

bahviour應該在實體上。此外,身份證和金額應該是公共會員的私人會員。所以它看起來像這樣:

public GiftCard 
{ 
    private int _id; 
    private double _amount; 

    public int Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    public double Amount 
    { 
     get { return _amount; } 
     set { _amount = value; } 
    } 

    public void ReduceAmount(double amount) 
    { 
     // Validation checks to make sure amount can be removed. 
     ... 

     //Reduce amount. 
     _amount -= amount; 
    } 
} 
+0

如果我想跟蹤數據庫中給定禮品卡的每個數量減少量?我會從實體上的方法ReduceAmount調用存儲庫來插入記錄嗎?我會怎麼做呢?順便說一句,感謝您的幫助。 – Frankie 2011-12-21 14:14:51

+0

做到這一點的一種方法是擁有一個Payment對象,並且GiftCar擁有一個Payment對象集合。對於每個添加的金額,將金額的值放入Payment對象中並將其添加到集合中。確保付款對象已被映射。然後,如果您使用的是NHibernate或simmilar,那麼當您保存GiftCard對象時,所有Payment對象都將隨之保存。您不需要從實體訪問存儲庫,實際上這是一種反模式。 – 2011-12-21 15:13:04

+0

好的。大。這就說得通了。謝謝。 – Frankie 2011-12-21 16:34:35