2015-04-19 19 views
1

如何通过实体类型在流畅验证中注入或找到验证器? 我有以下类和希望通过液态验证验证实体如何在流利验证中通过实体类型注入或查找验证器?

public class BaseEntity {} 

    public class Article :BaseEntity 
    { 
     public string Name {get;set;} 
    } 

    public class ArticleValidator : AbstractValidator<Article> 
    { 
     public ArticleValidator() 
     { 
       RuleFor(x => x.Name).NotEmpty().Length(0,512); 
     } 
    } 

,并有一些推广的BaseEntity:

public static ValidationResult Validate(this BaseEntity entity) 
    { 
     //????and here how i can find entity validator by type of entity and validate it and return result. 
    } 

    public class ArticleService 
    { 
     public void AddArticle(Article aricle) 
     { 
      var result = article.Validate(); 
      if(result.IsValid) 
       ;....... 
     } 
    } 
+1

@VaibhavMule问题中描述的代码是C#,而不是Java。 – Radiodef

回答

1

你需要像这样

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using FluentValidation; 
using FluentValidation.Results; 

namespace HelloWorld 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var c = new MyClass(); 
      var result = Validate(c); 
     } 

     public static ValidationResult Validate(object c) 
     { 
      if (c == null) throw new ArgumentNullException("c"); 

      var vt = typeof (AbstractValidator<>); 
      var et = c.GetType(); 
      var evt = vt.MakeGenericType(et); 

      var validatorType = FindValidatorType(Assembly.GetExecutingAssembly(), evt); 

      var validatorInstance = (IValidator)Activator.CreateInstance(validatorType); 
      return validatorInstance.Validate(c); 
     } 


     public static Type FindValidatorType(Assembly assembly, Type evt) 
     { 
      if (assembly == null) throw new ArgumentNullException("assembly"); 
      if (evt == null) throw new ArgumentNullException("evt"); 
      return assembly.GetTypes().FirstOrDefault(t => t.IsSubclassOf(evt)); 
     } 
    } 


    public class MyClassValidator : AbstractValidator<MyClass> 
    { 

    } 

    public class MyClass 
    { 

    } 
} 

确保您的具体验证有至少有一个无参数的构造函数。 祝你好运