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



在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));
    }
}

此类将由几个实体用于计划目的。

在这一点上,这既不是实体(它没有标识),也不是值对象(它不是不可变的)。

一种解决方案是通过使其不可变("添加"或"删除"项将返回ScheduledItems的新实例),将其转换为Value对象。

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

该类看起来像ScheduledItems的存储库。因此,ScheduledItem是实体,ScheduledItems是具有Add()、Remove()方法的存储库。

我想这取决于项目排序的原因。

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

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

如果以上都没有,我会认为这是一个类似于集合的助手类,它可以位于基础结构层的一部分,可以在其他层中使用。

相关内容

  • 没有找到相关文章

最新更新