2017-02-03 27 views
1

我在.net核心项目中使用结构图作为DI框架。 我fluentValidation注册为是如下:使用FluentValidation的StructureMap

public class DefaultRegistry : Registry 
{ 
    public DefaultRegistry() 
    { 
     Scan(o => 
     { 
      o.AssemblyContainingType<Startup>(); 
      o.AddAllTypesOf<IValidator>(); 
      o.LookForRegistries(); 
      o.AddAllTypesOf<Profile>(); 
      o.WithDefaultConventions(); 
     }); 
    } 
} 

时抛出错误:从AbstractValidator http://pastebin.com/eDHEcCfc

我继承了验证器类:

public class DefaultValidator : AbstractValidator<DefaultViewModel> 

DI工作时,我只有一个验证器类,一旦我创造了第二个,它打破了。

我也用汇编搜索注册所有实例验证:

services 
       .AddMvc() 
       .AddFluentValidation(x=>x.RegisterValidatorsFromAssemblyContaining<Startup>()) 
+0

验证器是singletons,将它们注册为瞬态 – crowchirp

+0

不解决问题 –

回答

0

问题与自定义验证器厂解决。

实现FluentValidation接口IValidatorFactory并注入StructureMap的IContainer

using System; 
using System.Reflection; 
using FluentValidation; 
using StructureMap; 

namespace Business.Managers.Interfaces 
{ 
    public class FluentValidatorFactory : IValidatorFactory 
    { 
     private readonly IContainer _container; 

     public FluentValidatorFactory(IContainer container) 
     { 
      _container = container; 
     } 
     public IValidator<T> GetValidator<T>() 
     { 
      return (IValidator<T>)GetValidator(typeof(T)); 
     } 

     public IValidator GetValidator(Type type) 
     { 
      IValidator validator; 

      try 
      { 
       validator = CreateInstance(typeof(IValidator<>).MakeGenericType(type)); 
      } 
      catch (Exception) 
      { 
       // Get base type and try to find validator for base type (used for polymorphic classes) 
       var baseType = type.GetTypeInfo().BaseType; 
       if (baseType == null) 
       { 
        throw; 
       } 

       validator = CreateInstance(typeof(IValidator<>).MakeGenericType(baseType)); 
      } 

      return validator; 
     } 

     public IValidator CreateInstance(Type validatorType) 
     { 
      return _container.GetInstance(validatorType) as IValidator; 
     } 
    } 
} 

也解决由定制服务正确验证:

using FluentValidation; 
using FluentValidation.Results; 

namespace Business.Managers.Interfaces 
{ 
    public class ValidationManager : IValidationManager 
    { 
     private readonly IValidatorFactory _validatorFactory; 

     public ValidationManager(IValidatorFactory validatorFactory) 
     { 
      _validatorFactory = validatorFactory; 
     } 

     public ValidationResult Validate<T>(T entity) where T : class 
     { 
      var validator = _validatorFactory.GetValidator(entity.GetType()); 
      var result = validator.Validate(entity); 
      return result; 
     } 
    } 
} 

在startup.cs注册验证与AddFluentValidation

services.AddMvc().AddFluentValidation(x=>x.RegisterValidatorsFromAssemblyContaining<LoansRequestValidator>());