【发布时间】:2016-03-08 15:40:52
【问题描述】:
我正在尝试使用 IoC 容器将服务注入到 Validation 类中。请看下面的例子:
[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。看起来我没有注册验证器服务。
标签: c# asp.net asp.net-web-api2 fluentvalidation light-inject