我正在尝试使用 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 将被注入到验证类中。相反,我收到一个异常,抱怨找不到无参数的构造函数。
经过一些研究后,我尝试创建一个 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 容器不知道如何为验证器解析正确的实例。
任何想法都非常感谢。