2014-11-06 47 views
3

在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 Object。

但是,这是真的有必要的东西是不是真的与域相关?这个类可以像其他任何.NET集合一样。

+6

当调度不属于您的域时,将其作为基础设施方面(如日志记录或安全性)处理。 – Jehof 2014-11-06 06:54:05

+0

@Jehof:这完全不是基础设施问题。它纯粹是由域实体使用的'SortedDictionary'包装器。 – davenewza 2014-11-06 11:33:06

回答

0

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

+0

它不是一个存储库,'ScheduledItem'也不是一个实体。一个实体可以像使用'List'或'Dictionary'一样使用这个类。这实际上是'SortedDictionary'的封装。 – davenewza 2014-11-10 06:23:44

0

我想这取决于为什么项目排序。

如果需要根据特定业务规则对其进行排序,那么这应该是您的域的一部分。

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

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

相关问题