Свободная проверка и IoC (уникальное поле) - PullRequest
5 голосов
/ 19 июля 2011

Я разрабатываю веб-приложение с asp.net mvc 3 и DDD.Для проверки моей доменной модели я использовал Свободную проверку.Это мой первый проект с быстрой проверкой, и я все еще изучаю и моделирую сущности.

Моя сущность Клиент имеет два свойства, которые должны быть уникальными в моей системе, это свойства электронной почты и CPF (это бразильский документи должны быть уникальными во всей системе).Я хотел бы знать, как я могу это сделать?

Итак, моя идея заключается в том, чтобы внедрить (по конструктору) мой репозиторий в мой класс проверки Customer и проверить его с помощью пользовательской проверки.Проверкой будет проверка с использованием репозитория, если в моей таблице есть запись с этим электронным письмом, отличным от Id (0 для вставок и реальный Id для обновлений ... Мне не нужно проверять обновляемую запись, потому что она 'всегда буду правдой)

Я пытаюсь что-то вроде этого:

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

     }   }

Я не знаю, возможно ли это, вставить хранилище в валидатор, и как я могу получить идентификатор в .Mustрасширение метода?Или есть другой способ сделать это?

1 Ответ

9 голосов
/ 19 июля 2011
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));

При этом проверка уникальности также могла бы быть более эффективной в самой системе (базе данных?) В тот момент, когда вы пытаетесь вставить запись и перехватить соответствующее исключение вместо того, чтобы делать это на уровне проверки. Причина этого заключается в том, что между временем проверки уникальности FluentValidation и фактическим временем вставки записи может произойти много вещей.

...