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