我试图找到这个命名问题的解决方案,但我无法在网络上的任何地方找到类似的用法。可能是我们在域模型中有设计流程,或者我们根本没有为所谓的“ValueObjects”使用适当的名称。
请阅读以下内容..
我们使用具有CQRS模式的域驱动设计。以下是域模型的设计方法。
P.S不相关但是为了您的信息,我们的应用程序使用ASP.NET MVC和Controller与服务层进行通信。 DTO(数据传输对象)传入/传出到MVC控制器,这不在上图中。
问题是我们没有正确使用“ValueObject”。根据Martin Fowler的定义,我们的ValueObjects不是ValueObject的真实表示。 http://martinfowler.com/bliki/ValueObject.html
例如,我们的ValueObjects具有标识。
public class NoteValue
{
public int Id { get; set; }
public string NoteName { get; set; }
public string NoteNumber { get; set; }
public DateTime NotExpiry { get; set; }
}
这些ValueObject只是在Commands,AggregateRoots和Domain Entities之间传递数据。 例如,AggregateRoot只是根据域实体创建ValueObjects,并将这些ValueObjects返回到命令层。
以下不是完整的实施。只是一个显示交互的简单示例
AggregateRoot扩展方法:
private static IList<NoteValue> ToValueObject(this ICollection<Note> source)
{
var values = new List<NoteValue>();
if (source != null)
source.ForEach(i => values.Add(i.ToValueObject()));
return values;
}
AggregateRoot:
Public IList<NoteValue> GetNotesValues()
{
return this._notes.ToValueObject();
}
命令:
var motesValues = notesAggregate.GetNotesValues();
我们正在努力为这些所谓的“ValueObjets”找到合适的名称。它们似乎也不是DTO,我们也希望能够区分服务层中使用的DTO。具体来说,我们想知道一个适当的名称,我们可以调用这些类型的对象(ValueObjects)。任何想法都非常感激。
答案 0 :(得分:3)
我不知道这是否能回答你的问题,但我希望能指出你正确的方向。
Dan Berg Johnsson对价值对象进行了非常好的讨论:http://www.viddler.com/v/6939b23
另请参阅Vaughn Vernon关于有效聚合设计的论文:http://dddcommunity.org/library/vernon_2011
总而言之,DDD(特别是在建筑层面上应用CQRS时)需要一些时间来掌握。请耐心等待,阅读,学习并加入DDD / Cqrs Google小组