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

Domain driven design 域建模:既不是实体也不是值对象,domain-driven-design,immutability,value-objects,Domain Driven Design,Immutability,Value Objects,在DDD中,域模型由实体和值对象组成,但是当我们需要模型中的某个东西时,我们该怎么做呢 例如,为了封装调度细节,我引入了以下ScheduledItems实现: public class ScheduledItems<T> { private SortedDictionary<DateTime, T> scheduledItems; public ScheduledItems() { scheduledItems = new Sor

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

例如,为了封装调度细节,我引入了以下
ScheduledItems
实现:

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
{
专用分类词典;
公共ScheduledItems()
{
scheduledItems=新的SortedDictionary();
}
公共无效ScheduleItem(日期时间ScheduleDate,T项)
{
scheduledItems.Add(scheduledDate,item);
}
公共无效删除项(T项)
{
日程安排
其中(x=>x.Value.Equals(项))
.选择(x=>x.Key)
托利斯先生()
.ForEach(k=>scheduledItems.Remove(k));
}
}
该类将由几个实体用于调度目的

此时,这既不是实体(它没有标识),也不是值对象(它不是不可变的)

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


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

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

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

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

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


如果没有上述内容,我会认为这是一个类似Help类的集合,它可以在基础层中的一部分,可以跨其他层使用。< /P>将它作为基础设施方面(如日志记录或安全性)处理,当调度不是您域的一部分。@ Jehof:这根本不是一个基础设施的问题。它纯粹是一个由域实体使用的

SortedDictionary
包装器。根据我的经验,有时候用例看起来像域模型中的一个组件,但定义不能适合DDD的任何构建块。也许它是一个用例。它不是一个存储库,
ScheduledItem
也不是一个实体。实体将使用此类,就像它可以使用
列表
字典
一样。这实际上是
SortedDictionary
的包装。