2016-11-09 127 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)

發佈正確的模型後,現在驗證正確。