Я пытаюсь внедрить сервис, используя контейнер IoC, в класс Validation. Смотрите пример ниже:Как использовать FluentValidation с LightInject в проекте asp.net web-api
[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