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