0

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 还是从列表中删除?

4

1 回答 1

0

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

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

间接回答:如果你觉得这很尴尬,你可能会问自己要保护的不变量是什么?让 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
于 2013-10-09T01:08:04.600 回答