域对象是否可以创建对象?

时间:2017-06-20 08:23:59

标签: c# unit-testing domain-driven-design

请参阅代码:

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委托会更好(所以包含上面迭代器的类不必知道工厂。

2 个答案:

答案 0 :(得分:3)

  

域对象是否可以创建对象?

是的,这通常是新陈述的来源。

例如,请参阅Don't Create Aggregate Roots。或者在事件源系统中的众多示例中的任何一个,其中域对象创建描述它们如何随时间演变的事件。

Greg Young经常使用TradeBook作为事件源域的示例。订单从外部世界到达,但域模型负责决定哪些订单配对在一起进行交易。因此,表示Trade的值对象是在域模型中创建的。

该对象是通过直接调用其构造函数创建的,还是通过在模型中的某个其他对象上调用方法,或者在工厂中调用方法,或者在域服务上调用方法,都是一个问题。品味。

答案 1 :(得分:1)

在DDD中,我希望这个代码在服务而不是域对象中。

看起来这个代码看起来不依赖于域对象的任何状态,因此将其移动到域服务应该是微不足道的。