2015-04-19 23 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 
    { 

    } 
} 

確保您的具體驗證有至少有一個無參數的構造函數。 祝你好運