Question

Je suis en train d'utiliser xVal pour valider l'enregistrement d'un nouvel utilisateur. Je suis tombé sur une scie à la mode en essayant de mettre en œuvre la logique qui vérifie si le nom d'utilisateur que le nouvel utilisateur essaie de s'enregistrer est déjà pris. Je ne peux pas sembler trouver un moyen d'y arriver sans avoir mon entité utilisateur ont une dépendance à l'égard de mon UsersRepository. Voici la méthode que je dois trouver un moyen de mettre en œuvre dans l'entité mon utilisateur:

public IEnumerable<ErrorInfo> ValidateUniqueUserName(string username)
{
    if(usersRepository.Users.Exists(m => (m.UserName == username)))
        yield return new ErrorInfo("UserName", "User name already exists");
}

Toutes les idées sur la façon dont je peux continuer à utiliser xVal pour ce scénario et garder mon entité utilisateur découplé de mon UsersRepository?

Était-ce utile?

La solution

DDD suggère que vous pourriez avoir un service de domaine abstraire les utilisateurs repo de la validation de domaine (faire observer invariant).

Je voudrais savoir où le code de votre exemple ci-dessus réside (service de validation)? Mais je vous suggère de vous assurer qu'il est dans le domaine. Voici une façon intelligente pour attacher la validation complexe à des entités qui prennent en charge encore l'interface IDataErrorInfo.

Ce que je propose est un service de domaine au sein de votre méthode de validation qui retourne votre requête Users.Exists. Quelque chose comme:

        base.AddRule(new ValidationRule()
        {
            Properties = "username",
            Description = "User name already exists",
            validator = () => !(new UserService()).Users.Exists(m => (m.UserName == username))
        });

Dans l'exemple ci-dessus, je vais utiliser DI pour injecter les dépendances appropriées dans le UserService pour accéder à des prises en pension / données, mais vous pouvez utiliser une méthode de création usine ou objet manuel DI si vous le souhaitez:

        base.AddRule(new ValidationRule()
        {
            Properties = "username",
            Description = "User name already exists",
            validator = () =>
                {
                    UserService us = ObjectFactory.GetInstance<UserService>();
                    return !us.Users.Exists(m => (m.UserName == username));
                }
        });

NOTE: Le méthode ci-dessus exige la propriété validator être mis à false pour indiquer un état non valide (en cas qui n'a pas été clair).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top