5

Je développe une application web avec asp.net mvc 3 et DDD. Pour la validation de mon modèle de domaine, j'utilise Fluent Validation. C'est mon premier projet avec une validation fluide et j'apprends encore et je modélise les entités.Validation fluide et IoC (champ unique)

Mon entité Client a deux propriétés qui doivent être uniques dans mon système, ces propriétés sont Email et CPF (c'est un document brésilien qui doit être unique dans tout le système). Je voudrais savoir, comment puis-je le faire? Donc, mon ideia est, injecter (par le constructeur) mon référentiel dans ma classe de validation du client et le vérifier par une validation personnalisée. La validation serait de vérifier en utilisant le référentiel s'il y a un enregistrement dans ma table avec cet email différent d'un identifiant (0 pour les insertions et un identifiant réel pour les mises à jour ... Je n'ai pas besoin de vérifier l'enregistrement que je suis en train de mettre à jour d toujours être vrai).

`m essayer quelque chose comme ceci:

public class CustomerValidator : AbstractValidator<Customer> { 

    protected ICustomerRepository Repository { get; set; } 

    // I intend to inject it by IoC with Unity.. is it possible ? 
    public CustomerValidator(ICustomerRepository rep) 
    { 
     this.Repository = rep; 

     // other properties 

     RuleFor(customer = customer.Email) 
      .EmailAddress() 
      .NotEmpty() 
      .Must(email = { return Repository.IsEmailInUse(email, ?); }); 

     RuleFor(customer = customer.CPF) 
      .NotEmpty() 
      .Must(cpf = { return Repository.IsCPFInUse(cpf, ?); }); 

    } } 

Je ne sais pas si possible, injecter un dépôt à l'intérieur du validateur, et comment pourrais-je obtenir l'ID dans l'extension de la méthode .Must? Ou y a-t-il une autre méthode pour le faire?

Répondre

9
RuleFor(customer => customer.Email) 
    .EmailAddress() 
    .NotEmpty() 
    .Must((customer, email) => Repository.IsEmailInUse(email, customer.Id)); 

RuleFor(customer => customer.CPF) 
    .NotEmpty() 
    .Must((customer, cpf) => Repository.IsCPFInUse(cpf, customer.Id)); 

Cela dit, de vérifier l'unicité pourrait aussi être plus efficace fait par le système lui-même (base de données?) Au moment où vous essayez d'insérer l'enregistrement et attrapez l'exception appropriée au lieu de le faire dans la validation couche. La raison en est que, entre le moment où votre FluentValidation vérifie l'unicité et le moment où un enregistrement est inséré, beaucoup de choses peuvent arriver.

+0

Merci pour votre Darin awser, mais votre commentaire a conduit à une confusion en moi. Cette validation devrait-elle être effectuée ailleurs? Dans ma base de données, j'ai des contraintes uniques qui font aussi cette validation, mais j'ai besoin de l'empêcher par le modèle de domaine et l'interface utilisateur aussi, pour éviter les exceptions, n'est-ce pas? Cette classe de validation est dans le projet de bibliothèque de classes de mon domaine, est-ce correct? Ou devrais-je faire une couche de validation? Je ne sais pas beaucoup sur DDD et les concepts, j'essaie d'apprendre ... Merci :) –

+0

Maintenant c'est l'homme qui travaille! Merci! –