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

    } 
} 

Убедитесь, что ваши конкретные валидаторы имеют по крайней мере, один бездонный конструктор. Удача