2016-03-08 29 views
1

我试图将使用IoC容器的服务注入到Validation类中。看下面的例子:如何在asp.net web-api项目中使用LightInject的FluentValidation

[Validator(typeof(UserPayloadValidator))] 
public class UserPayload 
{ 
    public int UserId { get; set; } 
} 

public class UserPayloadValidator : AbstractValidator<UserPayload> 
{ 
    private IUserService _userService; 

    public UserPayloadValidator(IUserService userService) 
    { 
     _userService = userService; 

     RuleFor(x => x.UserId).Must(BeUnique).WithMessage("This user already exists"); 
    } 

    private bool BeUnique(int userId) 
    { 
     var user = _userService.GetUser(userId); 

     return user == null; 
    } 
} 

在这一点上,我希望一切都将自动神奇的工作和userService将被注入到验证类。相反,我得到一个异常,抱怨找不到无参数的构造函数。

之后一些reasearch我试图创建一个ValidationFactory在链接的例子。

public class LightInjectValidationFactory : ValidatorFactoryBase 
{ 
    private readonly ServiceContainer _serviceContainer; 

    public LightInjectValidationFactory(ServiceContainer serviceContainer) 
    { 
     _serviceContainer = serviceContainer; 
    } 

    public override IValidator CreateInstance(Type validatorType) 
    { 
     return _serviceContainer.TryGetInstance(validatorType) as IValidator; 
    } 
} 

,并在LightInject配置

//Set up fluent validation 
FluentValidationModelValidatorProvider.Configure(httpConfiguration, provider => 
{ 
    provider.ValidatorFactory = new LightInjectValidationFactory(container); 
}); 

这将导致一个例外: 无法解析类型:FluentValidation.IValidator`1

我猜IoC容器不知道如何为验证器解析正确的实例。

任何想法非常赞赏。

+0

你如何注册'IUserService'和'UserPayLoadValidator'? –

+0

谢谢@YannickMeeus。它看起来像我没有注册验证器服务。 – Bogdan

回答

2

感谢上面的评论,我意识到我实际上并没有在容器中注册验证器。这可以这样做了所有验证:

FluentValidation.AssemblyScanner.FindValidatorsInAssemblyContaining<UserPayloadValidator>() 
      .ForEach(result => 
      { 
       container.Register(result.InterfaceType, result.ValidatorType); 
      }); 

请注意,UserPayloadValidator需要只是一个你的校验。基于这种类型,FindValidatorsInAssembly可以推断出所有其他可用的验证器。

此外,在验证的工厂,你应该使用TryGetInstance代替的GetInstance的情况下,工厂试图实例不存在的验证器(控制器参数,其验证器不存在)

+0

很棒@Bogdan对我来说非常有用,还有一件事我有一个以上的Validator类,所以我怎样才能在光线注入中使用它? –

0

我已经找到了所有的验证解决方案类使用注入服务。

替换下面的代码

FluentValidation.AssemblyScanner.FindValidatorsInAssemblyContaining<UserPayloadValidator>() 
      .ForEach(result => 
      { 
       container.Register(result.InterfaceType, result.ValidatorType); 
      }); 

随着

FluentValidation.AssemblyScanner findValidatorsInAssembly = FluentValidation.AssemblyScanner.FindValidatorsInAssembly(typeof(UserPayloadValidator).Assembly); 
      foreach (FluentValidation.AssemblyScanner.AssemblyScanResult item in findValidatorsInAssembly) 
      { 
       container.Register(item.InterfaceType, item.ValidatorType); 
      } 

使用这所有的验证类使用注射服务。

相关问题