2016-11-09 124 views
0

我想在WebApi项目(而不是asp.net核心)中使用FluentValidation。FluentValidation与Mediatr和Unity

我有以下代码:

public static class UnityConfig 
{ 
    public static void RegisterComponents(UnityContainer container) 
    { 
     // Register validators 
     RegisterValidators(container); 

     // Mediatr 
     container.RegisterType<IMediator, Mediator>(); 
     container.RegisterTypes(AllClasses.FromAssemblies(true, Assembly.GetExecutingAssembly()), WithMappings.FromAllInterfaces, GetName, GetLifetimeManager); 

     container.RegisterInstance<SingleInstanceFactory>(t => container.Resolve(t)); 
     container.RegisterInstance<MultiInstanceFactory>(t => container.ResolveAll(t)); 

     // Automapper profiles 
     var profileTypes = typeof(BaseProfile).Assembly.GetTypes().Where(type => type.IsSubclassOf(typeof(BaseProfile))); 
     var config = new MapperConfiguration(cfg => new MapperConfiguration(x => 
     { 
      foreach (var type in profileTypes) 
      { 
       var profile = (BaseProfile)Activator.CreateInstance(type); 
       cfg.AddProfile(profile); 
      } 
     })); 

     container.RegisterInstance<IConfigurationProvider>(config); 

     GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
    }   

    static LifetimeManager GetLifetimeManager(Type type) 
    { 
     return IsNotificationHandler(type) ? new ContainerControlledLifetimeManager() : null; 
    } 

    static string GetName(Type type) 
    { 
     return IsNotificationHandler(type) ? string.Format("HandlerFor" + type.Name) : string.Empty; 
    } 

    private static void RegisterValidators(IUnityContainer container) 
    { 
     var validators = AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()); 
     validators.ForEach(validator => container.RegisterType(validator.InterfaceType, validator.ValidatorType)); 
    } 
} 

我扫描组件和registrering的验证,其中只有一个,现在,它坐落在这里:(不介意怪异的验证,我“M想拥有它失败)

public class Query : IRequest<Result> 
    { 
     public Guid? Id { get; set; } 
    } 

    public class QueryValidator : AbstractValidator<Query> 
    { 
     public QueryValidator() 
     { 
      RuleFor(q => q.Id).Empty(); 
      RuleFor(q => q.Id).Equal(Guid.NewGuid()); 
     } 
    } 

我的Application_Start是这样的:

protected void Application_Start() 
    { 
     var container = new UnityContainer(); 
     UnityConfig.RegisterComponents(container); 

     GlobalConfiguration.Configure(WebApiConfig.Register);    

     var factory = new UnityValidatorFactory2(GlobalConfiguration.Configuration); 

     FluentValidationModelValidatorProvider.Configure(GlobalConfiguration.Configuration, x => x.ValidatorFactory = factory); 
    } 

而且我有以下验证工厂:

public class UnityValidatorFactory2 : ValidatorFactoryBase 
{ 
    private readonly HttpConfiguration _configuration; 

    public UnityValidatorFactory2(HttpConfiguration configuration) 
    { 
     _configuration = configuration; 
    } 

    public override IValidator CreateInstance(Type validatorType) 
    { 
     var validator = _configuration.DependencyResolver.GetService(validatorType) as IValidator; 

     return validator; 
    } 
} 

现在;当我打电话控制器上的行动,“的CreateInstance”尝试解析类型的validatorType:的

IValidator<Guid> 

代替:

IValidator<Query> 

,当然觉得没有什么,这意味着我的验证呢不跑。

有没有人有一个想法,为什么这是?它看起来很直截了当,所以我很难看出哪里出了问题。

回答

0

睡过之后,我自己找到了答案。

我张贴一个GUID来我的控制器,而不是我试图验证模型(其中只包含一个GUID)

发布正确的模型后,现在验证正确。