请参阅代码:
public System.Collections.Generic.IEnumerable<IDenomination> GetDenominations(decimal Cost, decimal PaymentReceived)
{
decimal ChangeRequired = PaymentReceived - Cost;
foreach (decimal CurrencyAmount in Currency.CurrencyDenominations())
{
if (ChangeRequired / CurrencyAmount >= 1)
{
int Quantity = (int)Math.Floor(ChangeRequired / CurrencyAmount);
IDenomination ChangeDenomination = ChangeDenominationsFactory.Create(CurrencyAmount, Quantity);
yield return ChangeDenomination;
ChangeRequired = ChangeRequired - (ChangeDenomination.Amount * ChangeDenomination.Quantity);
}
}
}
此方法是域对象的一部分。我担心的是Domain Object负责通过工厂创建对象。从DDD的角度来看,这是否可以接受?
昨天我正在阅读SLaks(https://stackoverflow.com/users/34397/slaks)回答(或评论过)的问题。他建议使用工厂或Func代表。我没有保存链接到我的收藏夹。我花了近1.5个小时搜索这个问题,但是我找不到它。如果其他人可以找到它,请发布链接。我在徘徊是否一个Func委托会更好(所以包含上面迭代器的类不必知道工厂。
答案 0 :(得分:3)
域对象是否可以创建对象?
是的,这通常是新陈述的来源。
例如,请参阅Don't Create Aggregate Roots。或者在事件源系统中的众多示例中的任何一个,其中域对象创建描述它们如何随时间演变的事件。
Greg Young经常使用TradeBook作为事件源域的示例。订单从外部世界到达,但域模型负责决定哪些订单配对在一起进行交易。因此,表示Trade的值对象是在域模型中创建的。
该对象是通过直接调用其构造函数创建的,还是通过在模型中的某个其他对象上调用方法,或者在工厂中调用方法,或者在域服务上调用方法,都是一个问题。品味。
答案 1 :(得分:1)
在DDD中,我希望这个代码在服务而不是域对象中。
看起来这个代码看起来不依赖于域对象的任何状态,因此将其移动到域服务应该是微不足道的。