【问题标题】:ddd, collections of value objectddd,值对象的集合
【发布时间】:2013-10-08 23:18:49
【问题描述】:

class Feed : Entity {
    public Guid Id {get;set;}
    public string FeedText {get;set;}

    public ISet<FeedUser> FeedUsers {get;set;}

    public void AddFeedUser(User user) {
        FeedUsers.Add(user.Id);
    }

    public void RemoveFeedUser(User user) {
        FeedUsers.Remove(user.Id);
    }

    public void MarkUserAsReadFeed(User user)
    {
        var feedUser = FeedUsers.Find(u=>u.Id == user.Id);
        feedUser.Read();
    }   
}

class FeedUser : ValueObject {
    public Guid UserId {get;private set;}
    public bool IsRead  {get;private  set;}
    public DateTime? ReadDate=null  {get;private set;}

    public void Read(){
        IsRead = true;
    }

    public void UnRead(){
        IsRead = false;
    }
}

在这种情况下,FeedUser 是值对象还是实体?我很困惑,因为 FeedUser 不需要身份但不是 100% 不可变(IsRead 属性可变)

一个 Feed 有很多 FeedUser。在 NHibernate,我应该加载所有 FeedUsers 属性(延迟加载或急切加载)以添加新的 FeedUser 还是从列表中删除?

【问题讨论】:

    标签: nhibernate domain-driven-design


    【解决方案1】:

    问题1:FeedUser 不是一个值对象,因为它是可变的并且具有它的生命周期(但与 Feed 的生命周期绑定)。在这个设计中,它是一个本地实体(userId 作为本地标识符)。

    问题2:恐怕您必须先加载所有FeedUser。

    间接回答:如果你觉得这很尴尬,你可能会问自己要保护的不变量是什么?让 FeedUser 成为一个聚合体怎么样?

    class Feed : Entity {
        public Guid Id {get;set;}
        public string FeedText {get;set;}        
    
        public FeedUser AddFeedUser(User user) {
            return new FeedUser(id, user); //sorry, I have to confess I'm not a .net guy.
        }
    }
    
    class FeedUser : Entity {
        public Guid id;
        public Guid feedId;
        public Guid UserId {get;private set;}
        public bool IsRead  {get;private  set;}
        public DateTime? ReadDate=null  {get;private set;}
    
        public void Read(){
            IsRead = true;
        }
    
        public void UnRead(){
            IsRead = false;
        }
    }
    //FeedUserRepository is responsible for removeing FeedUser
    

    【讨论】:

    • 如果删除 FeedUser 并添加新的 FeedUser(Feed 不添加它创建新的)责任是 FeedUserRepository,打破 ddd?以及如何从 Feed 访问 FeedUser?
    • @oguzh4n DDD 并不意味着封装一切的大聚合。聚合基于不变量保护。您似乎简化了示例,我不明白为什么费用需要访问 FeedUsers。您想详细说明不变量吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2014-06-03
    相关资源
    最近更新 更多