我们在DDD中使用域模型中使用的这些类型的对象是什么?

时间:2012-12-12 12:10:08

标签: domain-driven-design cqrs domain-model aggregateroot value-objects

我试图找到这个命名问题的解决方案,但我无法在网络上的任何地方找到类似的用法。可能是我们在域模型中有设计流程,或者我们根本没有为所谓的“ValueObjects”使用适当的名称。

请阅读以下内容..

我们使用具有CQRS模式的域驱动设计。以下是域模型的设计方法。

enter image description here

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)。任何想法都非常感激。

1 个答案:

答案 0 :(得分:3)

我不知道这是否能回答你的问题,但我希望能指出你正确的方向。

Dan Berg Johnsson对价值对象进行了非常好的讨论:http://www.viddler.com/v/6939b23

另请参阅Vaughn Vernon关于有效聚合设计的论文:http://dddcommunity.org/library/vernon_2011

总而言之,DDD(特别是在建筑层面上应用CQRS时)需要一些时间来掌握。请耐心等待,阅读,学习并加入DDD / Cqrs Google小组

相关问题