2009-04-29 42 views
2

假設我們在域模型中有兩個聚合根:組和用戶。DDD:如何建模添加和刪除相關實體?

現在,可以將用戶添加到組或從組中刪除。使用存儲庫模式,我目前只建模了以下兩個接口:

interface IGroupRepository 
{ 
    Group FindById(int groupId); 
} 
interface IUserRepository 
{ 
    User FindById(int userId); 
    IQueryable<User> GetGroupMembers(int groupId); 
    void AddUserToGroup(User user, Group group); 
    void RemoveUserFromGroup(User user, Group group); 
} 

不知何故,感覺不對。我想要實現一個乾淨的域模型,而不是僅僅建立一個數據訪問層。什麼會是一個更好的方式來建模上述?

編輯:這裏的根本問題似乎是,DDD的指導方針是否將用戶視爲「子對象」,同時它也是一個聚合根?正如我對DDD的理解,它指出只能從一個地方(存儲庫)檢索和存儲聚合根,這就是爲什麼我有點困惑。

回答

3

如果使用ORM如NHibernate的,以它的全部潛力,你可以有這樣的方法:

class Group 
{ 
    List<User> members; 

    void Join(User user) 
    { 
     members.Add(user); 
    } 

    void Leave(User user) 
    { 
     members.Remove(user); 
    } 
} 

一個體面的ORM將跟蹤更改成員名單,並堅持這些數據庫。

這將使你的接口可以簡化爲:

interface IGroupRepository 
{ 
    Group FindById(int groupId); 
} 

interface IUserRepository 
{ 
    User FindById(int userId); 
} 

This應該給你與NHibernate這樣一些指導。

+0

NHibernate的信息現在可以在http://nhforge.org/找到 - 舊的網站已經下來了,而現在 – 2009-04-29 08:18:59

+0

是不是這種方法處理的用戶不作爲一個聚合根?我很困惑 順便說一句,我不在乎堅持尚未 - 只是尋找一般設計模式 – JacobE 2009-04-29 08:19:53

1

在這種情況下,我會考慮在用戶上創建一個組的集合,反之亦然。這樣你就不需要存儲庫上的專門方法。大多數ORM框架支持這種映射

public class User 
{ 
    public virtual ICollection<Group> Groups {get;set;} 
}