2009-04-29 6 views
2

Disons que nous avons deux racines agrégées dans un modèle de domaine: Groupe et Utilisateur.DDD: Comment modéliser l'ajout et la suppression d'entités associées?

Maintenant, les utilisateurs peuvent être ajoutés ou supprimés des groupes. En utilisant le modèle référentiel, je ne modélise les deux interfaces suivantes jusqu'à présent:

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); 
} 

D'une certaine manière, ne se sent pas le droit. Je veux réaliser un modèle de domaine propre et ne pas finir avec une simple couche d'accès aux données. Quelle serait une meilleure façon de modéliser ce qui précède?

EDIT: La question fondamentale ici semble être, est-il OK avec les directives de DDD de traiter l'utilisateur comme un 'sous-objet' alors qu'il est en même temps une racine agrégée? Comme je l'ai compris DDD, il indique que les racines agrégées ne doivent être récupérées et stockées qu'à partir d'un endroit (le référentiel), c'est pourquoi je suis un peu confus.

Répondre

3

Si vous utilisez un ORM, comme NHibernate à son plein potentiel, vous pouvez avoir des méthodes comme celle-ci:

class Group 
{ 
    List<User> members; 

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

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

Un ORM décent permettra de suivre les modifications apportées à la liste des membres et persister ceux à la base de données.

Cela permettra à vos interfaces être simplifiées pour:

interface IGroupRepository 
{ 
    Group FindById(int groupId); 
} 

interface IUserRepository 
{ 
    User FindById(int userId); 
} 

This devrait vous donner quelques conseils sur le faire avec NHibernate.

+0

information NHibernate se trouve maintenant à http://nhforge.org/ - l'ancien site a été pendant un certain temps maintenant –

+0

est-ce pas cette approche traitant l'utilisateur comme non étant une racine agrégée? Je suis confus btw, je ne me soucie pas de la persistance tout à fait - juste à la recherche du motif de conception générale – JacobE

+1

Sort of. Si vous considérez seulement cette situation alors ce n'est probablement pas une racine agrégée. Cependant, je suppose que vous utiliseriez l'utilisateur pour beaucoup plus. La seule raison d'avoir un dépôt est comme un moyen de persister (la plupart du temps). Alors imaginez comment vous le modéliseriez d'abord sans le référentiel. –

1

Dans ce cas, je envisagerais de créer une collection de groupes sur l'utilisateur ou vice versa. De cette façon, vous n'avez pas besoin d'une méthode spécialisée sur le référentiel. La plupart des cadres ORM soutiennent ce type de mapping

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

La question centrale semble être si elle casse la cohérence du modèle de domaine pour traiter l'utilisateur comme un 'sous-objet' lorsqu'il s'agit en fait d'une racine agrégée. Va éditer la question un peu – JacobE

+0

Après avoir réfléchi plus à ce sujet, il semble naturel d'avoir une collection Users sur un groupe. Il devrait peut-être juste être perçu comme une liste de références aux instances root agrégées – JacobE

Questions connexes