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 は ID を必要としないが、100% 不変ではない (IsRead プロパティは変更可能) ため、混乱しています。

Feed には多数の FeedUser があります。NHibernate では、新しい FeedUser を追加したり、リストから削除したりするために、すべての FeedUsers プロパティ (遅延ロードまたは Eager ロード) をロードする必要がありますか?

4

1 に答える 1

0

質問 1: FeedUser は値オブジェクトではありません。変更可能でライフサイクルがあるためです (ただし、フィードのライフサイクルにバインドされます)。この設計では、ローカル エンティティ (ローカル識別子としての 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 に答える