我試圖將使用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容器不知道如何爲驗證器解析正確的實例。
任何想法非常讚賞。
你如何註冊'IUserService'和'UserPayLoadValidator'? –
謝謝@YannickMeeus。它看起來像我沒有註冊驗證器服務。 – Bogdan