DDD服务或实体模拟礼品卡金额减少

时间:2011-12-20 21:35:09

标签: c# domain-driven-design entity

前言:刚开始学习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.
     }
}

3 个答案:

答案 0 :(得分:2)

这只是我的意见,但在这样的情况下,我倾向于将这个逻辑放在域对象上。我实际上并没有真正开始使用服务,除非将一些依赖项引入域模型,例如:

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

在这种情况下,我会有一个用户注册服务。

然而,在你的情况下,只要让域对象足够智能以验证设置它自己的属性,它将使生活变得更加轻松。

再次,这就是我看待它的方式。

希望这会有所帮助

答案 1 :(得分:2)

首先,您可能希望属性为只读。这样,Id和Amount就不能仅通过设置值来改变。

接下来,您需要一种方法来对礼品卡进行交易。这些交易将借记相应的金额调整金额。像这样:

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

请记住,这只是众多设计方案中的一种。

答案 2 :(得分:2)

行为应该在实体上。此外,Id和Amount应该是具有公共访问者的私有成员。所以它看起来像这样:

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