2016-12-07 4 views
2

도메인 모델/엔티티의 유형에 따라 인증 방식을 달리해야합니다. 나는 아래 사람을 추천 검증을 마련 말 :FluentValidation 규칙을 여러 유효성 검사기에서 다시 사용할 수 있도록 구성하는 방법은 무엇입니까?

public class Product1Validator : AbstractValidator<Ticket> 
{ 
    public Product1Validator() 
    { 
     RuleFor(ticket => ticket.Policy.PolicyNumber) 
     .NotEmpty() 
     .WithMessage("Policy Number is missing."); 

     RuleFor(ticket => ticket.Policy.ApplSignedInState) 
     .NotEmpty() 
     .WithMessage("Application Signed In State is missing or invalid."); 
    } 
} 

public class Product2Validator : AbstractValidator<Ticket> 
{ 
    public Product2Validator() 
    { 
     RuleFor(ticket => ticket.Policy.PolicyNumber) 
     .NotEmpty() 
     .WithMessage("Policy Number is missing."); 

     RuleFor(ticket => ticket.Policy.ApplSignedInState) 
     .NotEmpty() 
     .WithMessage("Application Signed In State is missing or invalid."); 
    } 
} 


public class Product3Validator : AbstractValidator<Ticket> 
{ 
    public Product3Validator() 
    { 
     RuleFor(ticket => ticket.Policy.PolicyNumber) 
     .NotEmpty() 
     .WithMessage("Policy Number is missing."); 

     RuleFor(ticket => ticket.Policy.ApplSignedInState) 
     .NotEmpty() 
     .WithMessage("Application Signed In State is missing or invalid."); 

     RuleFor(ticket => ticket.Policy.DistributionChannel) 
     .NotEmpty() 
     .WithMessage("Distribution Channel is missing."); 
    } 
} 

가 어떻게 리팩토링 할 수있는 반복 RuleFor (들) 그래서 단지 그들 중 하나 다른 유효성 검사기에 의해 공유가 있다는 것을?

는 스티븐 감사

내가 Ouarzy의 아이디어를 실행하지만 난 코드를 작성할 때 컴파일되지 않습니다 확인하기

UPDATE. 2

문제

[TestMethod] 
public void CanChainRules() 
{ 
    var ticket = new Ticket(); 
    ticket.Policy = new Policy(); 
    ticket.Policy.ApplSignedInState = "CA"; 
    ticket.Policy.PolicyNumber = ""; 
    ticket.Policy.DistributionChannel = null; 

    var val = new Product1Validator(); 
    var result = val.Validate(ticket); //There is no Method 'Validate' 
    Assert.IsTrue(!result.IsValid); 
    Console.WriteLine(result.Errors.GetValidationText()); 
} 

UPDATE 내가 그것을 컴파일이 수정되면 새로운 복합 유효성 검사기는 AbstractValidator에서 상속하지 않았다,하지만 그들은 작동하지 않습니다. 귀하의 경우에는

class Program{ 
    static void Main(string[] args){ 
     var p = new Person(); 
     var pv = new PersonValidator(); 
     var vr = pv.Validate(p); 
     //Console.ReadKey(); 
    } 
} 

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime BirthDate { get; set; } 
} 

class PersonValidator : AbstractValidator<Person> 
{ 
    public PersonValidator() 
    { 
     CascadeMode = CascadeMode.Continue; 
     this.FirstName(); 
     this.LastName(); 
    } 
} 

static class Extensions 
{ 
    public static void FirstName(this AbstractValidator<Person> a) 
    { 
     a.RuleFor(b => b.FirstName).NotEmpty(); 
    } 
    public static void LastName(this AbstractValidator<Person> a) 
    { 
     a.RuleFor(b => b.LastName).NotEmpty(); 
    } 
} 

답변

2

, 내가 :

public class Product1Validator : AbstractValidator<Ticket> 
{ 
    public Product1Validator() 
    { 
     TicketValidator.Validate().Policy().ApplSignedState(); 
    } 
} 

UPDATE 3

원래의 대답에 대해 머리를 해치는와 제레미에게 도달 한 후 직접 GitHub의에 나는 다음과 함께했다 티켓에 대한 유창한 유효성 검사를 모든 규칙과 함께 구축하려고 시도한 다음 제품별로 필요한 유효성 검사를 호출합니다. 같은 뭔가 :

public class TicketValidator : AbstractValidator<Ticket> 
{ 
    public TicketValidator Policy() 
    { 
     RuleFor(ticket => ticket.Policy.PolicyNumber) 
     .NotEmpty() 
     .WithMessage("Policy Number is missing."); 

     return this; 
    } 

    public TicketValidator ApplSignedState() 
    { 
     RuleFor(ticket => ticket.Policy.ApplSignedInState) 
     .NotEmpty() 
     .WithMessage("Application Signed In State is missing or invalid."); 

     return this; 
    } 

    public TicketValidator DistributionChannel() 
    { 
     RuleFor(ticket => ticket.Policy.DistributionChannel) 
     .NotEmpty() 
     .WithMessage("Distribution Channel is missing."); 

     return this; 
    } 

    public static TicketValidator Validate() 
    { 
     return new TicketValidator(); 
    } 
} 

그리고 유창하게 구문을 사용하여 제품 당 한 후 하나 개의 검증은 :

public class Product1Validator 
{ 
    public Product1Validator() 
    { 
     TicketValidator.Validate().Policy().ApplSignedState(); 
    } 
} 

public class Product2Validator 
{ 
    public Product2Validator() 
    { 
     TicketValidator.Validate().Policy().ApplSignedState(); 
    } 
} 

public class Product3Validator 
{ 
    public Product3Validator() 
    { 
     TicketValidator.Validate().Policy().ApplSignedState().DistributionChannel(); 
    } 
} 

이 코드를 컴파일하려고하지 않았다,하지만 난 당신이 아이디어를 참조 바랍니다.

희망이 있습니다.

+0

코드가 잘 컴파일됩니다. 감사합니다. 그러나 그것을 호출하는 코드를 작성할 때 컴파일되지 않습니다. –

+0

내 코드에서 볼 수 있듯이 유효성 검사 기능은 사용자가 작성해야합니다. 예제에서는 빈 유효성 검사기를 반환하는 팩토리 메서드입니다. – Ouarzy

+0

을 원한다면 Empty() 또는 Build() 또는 Create()라고 불러주세요. 미안 해요. 당신은 'public static TicketValidator Validate()'를 수정하려고하고 있는데, 나는 당신이 이걸 가지고 어디로 가고 있는지 확실히 알지 못합니다. 나는 연쇄가 보이는 방식을 좋아하지 만, 나는 그것을 작동시킬 수 없다. –