域建模:既不是实体也不是值对象

时间:2014-11-06 06:29:47

标签: domain-driven-design immutability value-objects

在DDD中,域模型由实体和值对象组成,但是当我们在模型中需要某些东西时,我们该怎么办呢?

例如,我已经介绍了以下ScheduledItems<T>实现,以便封装调度细节:

public class ScheduledItems<T>
{
    private SortedDictionary<DateTime, T> scheduledItems;

    public ScheduledItems()
    {
        scheduledItems = new SortedDictionary<DateTime, T>();
    }

    public void ScheduleItem(DateTime scheduledDate, T item)
    {
        scheduledItems.Add(scheduledDate, item);
    }

    public void RemoveItem(T item)
    {
        scheduledItems
            .Where(x => x.Value.Equals(item))
            .Select(x => x.Key)
            .ToList()
            .ForEach(k => scheduledItems.Remove(k));
    }
}

这个类将被几个实体用于调度目的。

此时,既不是实体(它没有身份)也不是值对象(它不是不可变的)。

一种解决方案是通过使其成为不可变的方式将其转换为值对象(&#39;添加&#39;或者删除&#39;项将返回一个新的ScheduledItems实例)。

但对于与域名没有真正关联的东西,这是否真的有必要?这个类可以像任何其他.NET集合一样。

2 个答案:

答案 0 :(得分:0)

该类看起来像ScheduledItems的存储库。所以ScheduledItem是Entity,ScheduledItems是带有Add(),Remove()方法的Repository。

答案 1 :(得分:0)

我想这取决于项目的分类原因。

如果因某些业务规则需要对其进行排序,那么这应该是您域名的一部分。

如果需要对它们进行排序以在UI中正确显示,那么这很可能只是一些不应该属于域的视图逻辑。

如果不是上述内容,我会认为这是一个类似于集合的帮助程序类,它可以位于基础结构层的一部分中,可以在其他层中使用。