2013-10-08 7 views
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 (Lazy Load или Eager loading) для добавления нового FeedUser или удаления из списка?

ответ

0

Question1: FeedUser не является объектом значения, поскольку он изменен и имеет жизненный цикл (но привязан к жизненному циклу 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 
+0

при удалении FeedUser и добавлении нового FeedUser (Feed not add it create new one) Ответы являются FeedUserRepository, break ddd? и Как я могу получить доступ к FeedUsers из фида? – oguzh4n

+0

@ oguzh4n DDD не означает большие агрегаты, инкапсулирующие все. Агрегат основан на защите от атак. Кажется, что вы упрощаете пример, я не понимаю, зачем Fee нужен доступ к FeedUsers. Вы хотели бы подробнее рассказать об инвариантах? – Hippoom

Смежные вопросы