2015-06-09 13 views
18

Mam hierarchię klas danychC# FluentValidation dla hierarchii klas

public class Base 
{ 
    // Fields to be validated 
} 

public class Derived1 : Base 
{ 
    // More fields to be validated 
} 

public class Derived2 : Base 
{ 
    // More fields to be validated 
} 

Jaki byłby odpowiedni sposób potwierdzone Derived1 i Derived2 użyciu ramy FluentValidation bez powielania zasady pól klasy bazowej?

Odpowiedz

24

Jedno podejście do podjęcia byłby następujący:

public class Base 
{ 
    public string BaseName { get; set; } 
} 

public class Derived1 : Base 
{ 
    public string Derived1Name { get; set; } 
} 

public class BaseValidator<T> : AbstractValidator<T> where T : Base 
{ 
    public BaseValidator() 
    { 
     RuleFor(b => b.BaseName).NotNull(); 
    } 
} 

public class Derived1Validator : BaseValidator<Derived1> 
{ 
    public Derived1Validator() 
    { 
     RuleFor(d => d.Derived1Name).NotNull(); 
    } 
} 

Więc najpierw utworzyć bazę walidator, uczynić go przyjąć argumentu typu rodzajowego i określić, że typ ogólny musi być typu base. Skonfiguruj ogólne zasady dla swojej klasy bazowej i przejdź dalej.

Dla każdego walidatora, który sprawdza dzieci klasy podstawowej, te walidatory dziedziczą z baseValidator, gdzie T będzie typem klasy pochodnej.

+1

Dzięki za odpowiedź! –

+0

Idealny! Działa jak marzenie! Zauważono, że nie ma potrzeby dodawania: base() po pochodnym konstruktorze. Początkowo miałem jednak nie przechwycić testów podstawowych bez jawnego wywoływania podstawowego konstruktora. Ale tak jest! –

+0

Nie musisz dodawać base(), jeśli nie masz konstruktorów, ponieważ jest on tam automatycznie. Jeśli masz innych konstruktorów, oprócz domyślnego pustego, musisz użyć base() używając podpisu, którego potrzebujesz. Na klasach sprawdzania poprawności ... prawdopodobnie nigdy nie będziesz musiał dodawać żadnych innych różnych konstruktorów. – ppumkin

22
public class Derived2Validator : AbstractValidator<Derived2> 
{ 
    public Derived2Validator() 
    { 
     Include(new BaseValidator()); 
     Include(new Derived2Validator()); 
     RuleFor(d => d.Derived1Name).NotNull(); 
    } 
} 

Derived2Validator nie musi odziedziczyć BaseValidator lub Derived1Validator. Metoda Include będzie zawierała reguły z walidatorów podstawowych.

+10

Podejdę z tym podejściem, ponieważ sprzyja kompozycyjnemu dziedziczeniu, co jest złotą zasadą dla dobrych twórców –

Powiązane problemy