Je suis nouveau sur DDD, et j'essaie de l'appliquer dans la vie réelle. Il n'y a pas de questions à propos de telle logique de validation, null vérifier, les cordes à vide, etc - qui va directement à l'entité constructeur/propriété. Mais où mettre la validation de certaines règles comme "Unique" nom d'utilisateur?
Donc, nous avons entité Utilisateur
public class User : IAggregateRoot
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
// other data and behavior
}
Et de référentiel pour les utilisateurs
public interface IUserRepository : IRepository<User>
{
User FindByName(string name);
}
Les Options sont les suivantes:
- Injecter référentiel de l'entité
- Injecter référentiel à l'usine
- L'opération de création sur le domaine de service
- ???
Et chaque option est la plus détaillée:
1 .Injecter référentiel de l'entité
Je peux interroger le référentiel dans des entités constructeur/propriété. Mais je pense que garder de référence du référentiel au sein de l'entité est une mauvaise odeur.
public User(IUserRepository repository)
{
_repository = repository;
}
public string Name
{
get { return _name; }
set
{
if (_repository.FindByName(value) != null)
throw new UserAlreadyExistsException();
_name = value;
}
}
Mise à jour: On peut l'utiliser DI pour masquer la dépendance entre l'Utilisateur et IUserRepository via la Spécification de l'objet.
2. Injecter référentiel à l'usine
Je peux mettre cette vérification logique dans UserFactory. Mais que faire si nous voulons changer le nom de l'utilisateur?
3. L'opération de création sur le domaine de service
Je peux créer le domaine du service pour la création et la modification des utilisateurs. Mais quelqu'un peut directement modifier le nom de l'utilisateur sans appel à ce service...
public class AdministrationService
{
private IUserRepository _userRepository;
public AdministrationService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void RenameUser(string oldName, string newName)
{
if (_userRepository.FindByName(newName) != null)
throw new UserAlreadyExistException();
User user = _userRepository.FindByName(oldName);
user.Name = newName;
_userRepository.Save(user);
}
}
4. ???
Où mettez-vous mondial de la logique de validation pour les entités?
Merci!