Nhibernate ddd,值对象的集合

Nhibernate ddd,值对象的集合,nhibernate,domain-driven-design,Nhibernate,Domain Driven Design,类提要:实体{ 公共Guid Id{get;set;} 公共字符串FeedText{get;set;} 公共ISet用户{get;set;} public void AddFeedUser(用户用户){ FeedUsers.Add(user.Id); } public void RemoveFeedUser(用户用户){ FeedUsers.Remove(user.Id); } public void MarkUserAsReadFeed(用户) { var feedUser=FeedUsers

类提要:实体{
公共Guid Id{get;set;}
公共字符串FeedText{get;set;}
公共ISet用户{get;set;}
public void AddFeedUser(用户用户){
FeedUsers.Add(user.Id);
}
public void RemoveFeedUser(用户用户){
FeedUsers.Remove(user.Id);
}
public void MarkUserAsReadFeed(用户)
{
var feedUser=FeedUsers.Find(u=>u.Id==user.Id);
feedUser.Read();
}   
}
类FeedUser:ValueObject{
公共Guid用户标识{get;private set;}
public bool IsRead{get;private set;}
public DateTime?ReadDate=null{get;private set;}
公共无效读取(){
IsRead=true;
}
公共无效未读(){
IsRead=false;
}
}
在这种情况下,FeedUser是值对象还是实体?我很困惑,因为FeedUser不需要标识,但不是100%不变的(IsRead属性可更改)


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

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

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

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

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(Feed不是添加它创建新的FeedUser)的责任是FeedUserRepository,是否中断ddd?我如何从Feed访问feeduser?@oguzh4ndddd并不意味着封装所有内容的大型聚合。聚合基于入侵者保护。似乎你简化了这个例子,我不明白为什么Fee需要访问FeedUsers。你想详细介绍一下不变量吗?
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