5

Zajmuję się tworzeniem aplikacji internetowych z asp.net mvc 3 i DDD. Do sprawdzania poprawności mojego modelu domeny używam Fluent Validation. To mój pierwszy projekt z płynną weryfikacją i wciąż uczę się i modeluję te byty.Fluent Validation i IoC (Unique Field)

Moja jednostka Klient ma dwie właściwości, które muszą być unikalne w moim systemie, te właściwości to Email i CPF (jest to dokument w języku brazylijskim i musi być unikalny w każdym systemie). Chciałbym wiedzieć, jak mogę to zrobić?

Soo, moja ideia jest, wstrzyknij (przez konstruktor) moje repozytorium w mojej klasie sprawdzania poprawności klienta i sprawdź to przez niestandardową walidację. Sprawdzanie poprawności byłoby sprawdzane przy użyciu repozytorium, jeśli istnieje rekord w mojej tabeli z tym adresem e-mail innym niż identyfikator (0 dla wstawień i prawdziwy identyfikator dla aktualizacji ... Nie muszę sprawdzać rekordu, który aktualizuję, ponieważ " d zawsze będzie prawdą).

I`m próbuje coś takiego:

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

    } } 

ja nie wiem, czy jest to możliwe, wstrzyknąć repozytorium wewnątrz walidator i jak mogę uzyskać identyfikator w sposobie przedłużenia .Must? Czy istnieje inna metoda to zrobić?

Odpowiedz

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)); 

To zostało powiedziane, sprawdzanie unikatowości mogą być również bardziej efektywnie wykonywane przez samego systemu (bazy danych?) W momencie próbujesz wstawić rekord i złapać odpowiedni wyjątek zamiast robić to w ramach walidacji warstwa. Powodem tego jest to, że między momentem, w którym FluenceValidation sprawdził unikalność i faktyczny czas wstawienia rekordu, wiele rzeczy mogło się zdarzyć.

+0

Dziękuję za waszemu wtajemniczonemu Darinowi, ale wasz komentarz doprowadził mnie do zamieszania. Czy to zatwierdzenie powinno być w innym miejscu? W mojej bazie danych mam pewne wyjątkowe ograniczenia, które sprawiają, że ta walidacja też, ale muszę zapobiec jej również przez model domeny i UI, aby uniknąć wyjątków, czy to prawda? Ta klasa sprawdzania poprawności znajduje się w projekcie biblioteki klas mojej domeny, czy to też prawda? Czy powinienem zrobić warstwę weryfikacji? Nie wiem zbyt wiele o DDD i koncepcjach, próbuję się nauczyć ... Dzięki :) –

+0

Teraz działa człowiek! Dzięki! –

Powiązane problemy