如何在流畅的验证中按实体类型注入或查找验证器?

时间:2015-04-19 05:50:53

标签: c# fluent

如何在流畅的验证中按实体类型注入或查找验证器? 我有以下类,并希望通过流畅的验证验证实体

    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)
                 ;.......
         }
    } 

2 个答案:

答案 0 :(得分: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
    {

    }
}

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

答案 1 :(得分:0)

public class ValidationAspect : MethodInterception
{
    private Type _validatorType;
    public ValidationAspect(Type validatorType)
    {
        if (!typeof(IValidator).IsAssignableFrom(validatorType))
        {
            throw new System.Exception("This is not a validation class.");
        }

        _validatorType = validatorType;
    }
    protected override void OnBefore(IInvocation invocation)
    {
        var validator = (IValidator)Activator.CreateInstance(_validatorType);
        var entityType = _validatorType.BaseType.GetGenericArguments()[0];
        var entities = invocation.Arguments.Where(t => t.GetType() == entityType);
        foreach (var entity in entities)
        {
            ValidationTool.Validate(validator, entity);
        }
    }
}

public class BrandInsertDtoValidator : AbstractValidator<BrandInsertDto>
{
    public BrandInsertDtoValidator()
    {
        RuleFor(p => p.Name).NotNull();
        RuleFor(p => p.Name).NotEmpty();
        RuleFor(p => p.Name).MaximumLength(50);
        RuleFor(p => p.Name.Length).GreaterThanOrEqualTo(2);
    }
}


public class BrandInsertDto : IDTO
{
    public string Name { get; set; }
}