도메인 모델/엔티티의 유형에 따라 인증 방식을 달리해야합니다. 나는 아래 사람을 추천 검증을 마련 말 :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();
}
}
코드가 잘 컴파일됩니다. 감사합니다. 그러나 그것을 호출하는 코드를 작성할 때 컴파일되지 않습니다. –
내 코드에서 볼 수 있듯이 유효성 검사 기능은 사용자가 작성해야합니다. 예제에서는 빈 유효성 검사기를 반환하는 팩토리 메서드입니다. – Ouarzy
을 원한다면 Empty() 또는 Build() 또는 Create()라고 불러주세요. 미안 해요. 당신은 'public static TicketValidator Validate()'를 수정하려고하고 있는데, 나는 당신이 이걸 가지고 어디로 가고 있는지 확실히 알지 못합니다. 나는 연쇄가 보이는 방식을 좋아하지 만, 나는 그것을 작동시킬 수 없다. –