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

本文关键字:金额 服务 实体 模拟 DDD | 更新日期: 2023-09-27 18:18:31

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

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

开始时,您可能希望属性为只读。这样就不能通过设置值来改变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
         }
    }
}

请记住这只是众多设计选项之一。

这只是我的观点,但在这种情况下,我倾向于将此逻辑正确地放在域对象上。实际上,我不会真正开始使用服务,除非将一些依赖关系引入域模型,例如:

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

在本例中,我将有一个用户注册服务。

然而,在你的情况下,让域对象足够智能来验证设置它自己的属性会让事情变得容易得多。

再说一遍,这就是我的看法。

希望能有所帮助

行为应该在实体上。此外,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;
     }
}