2016-03-08 28 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); 
      } 

使用這所有的驗證類使用注射服務。

相關問題