Toujours en train d'expérimenter avec DDD et avoir quelques doutes, peut-être que quelqu'un m'aiderait.DDD: Où mettre la logique dans la racine d'agrégation
Disons que j'ai 2 modèles:
public class Event
{
User Creator;
List<User> Members;
}
public class User {}
Mon problème est que je ne vois pas de place pour la logique que je veux mettre en œuvre. J'ai besoin 3 actions:
- événement join utilisateur
- événement congé utilisateur
- Creator supprimer l'utilisateur de l'événement (seul Créateur peut supprimer des utilisateurs)
Pour l'instant, je viens de créer un service de domaine EventUserService qui appelle Event.RemoveUser/AddUser et ie. vérifie si CurrentUser (fourni par UserService) est le créateur de l'événement (avoir le droit de supprimer d'autres utilisateurs). Peut-être que cette approche est correcte, mais je pense toujours que je devrais mettre cette logique dans les racines d'agrégation, à savoir. :
- User.JoinEvent (Evénement) - Je peux ajouter un événement passé à la collection User.Events (bidirectionall) sur une certaine logique. User.LeaveEvent (Event) - analogue à JoinEvent.
- User.RemoveUserFromEvent (Utilisateur, événement) - Je peux avoir CreatedEvents collection utilisateur et événement de cette collection, je peux appeler Event.RemoveUser (utilisateur) - cette façon, je veillerai à ce que seul le créateur peut botter quelqu'un. Ou
- Evet.RemoveUser (UserToRemove) - mais comment vais-je m'assurer qu'il est appelé par le créateur?
Si la première méthode à deux semble ok (au moins pour moi), 3ème créerait Event.RemoveUser (pour gérer la collecte des membres de l'événement) méthode qui pourrait être utilisé à la logique de dérivation résidant dans User.RemoveUserFromEvent .
Ainsi, à la fin j'ai 2 questions:
- Quelle est votre approche dans ce genre de situation où deux racines d'agrégation travaille ensemble et une opération est de déterminer par une logique résidant dans les deux? Peut-être une sorte de methoods comme User.CanJoinEvent (Event)?
- Qu'en est-il créer le point de « danger » comme User.RemoveUserFromEvent
Peut-être que quelqu'un peut putt un peu de lumière peu sur cela pour moi, toute l'aide serait bien.
Thx pour la réponse. Après avoir posté cette question, je pensais plutôt à la solution que vous m'avez donnée, aux responsabilités et à la loi que vous avez mentionnées. Encore un petit doute sur l'utilisateur actuel - n'est-ce pas plus une partie de l'infrastructure que le domaine? Mais si c'est comme ça - alors comment gérer la logique qui dépend de l'utilisateur actuel? Passer l'utilisateur actuel comme argument et "croire" que c'est courant, aucun autre utilisateur? Dans mon cas, je pensais passer le service par l'argument à la méthode au lieu d'utiliser une propriété statique. – mgibas
oui. Utiliser un service et passer l'utilisateur actuel est une meilleure solution. mais à mon humble avis, IIdentity/IPrincipal est en .NET et facile à régler. Je l'utilise dans mes applications pour valider des choses. – jgauffin