【问题标题】:How to use FluentValidation with LightInject in asp.net web-api project如何在 asp.net web-api 项目中使用 FluentValidation 和 LightInject
【发布时间】: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 容器不知道如何为验证器解析正确的实例。

非常感谢任何想法。

【问题讨论】:

  • 您如何同时注册IUserServiceUserPayLoadValidator
  • 感谢@YannickMeeus。看起来我没有注册验证器服务。

标签: c# asp.net asp.net-web-api2 fluentvalidation light-inject


【解决方案1】:

感谢上面的评论,我意识到我实际上并没有在容器中注册验证器。对所有验证器都可以这样做:

FluentValidation.AssemblyScanner.FindValidatorsInAssemblyContaining<UserPayloadValidator>()
            .ForEach(result =>
            {
                container.Register(result.InterfaceType, result.ValidatorType);
            });

请注意,UserPayloadValidator 必须是您的验证者中的一个。基于这种类型,FindValidatorsInAssembly 可以推断出所有其他可用的验证器。

此外,在验证工厂中,您应该使用 TryGetInstance 而不是 GetInstance,以防工厂尝试实例化不存在的验证器(控制器中不存在验证器的参数)

【讨论】:

  • 很棒的@Bogdan,它对我非常有用,我还有不止一个验证器类,那么我如何在光注入中使用它们?
【解决方案2】:

我发现所有验证类都使用注入服务的解决方案。

替换下面的代码

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);
            }

使用这个你的所有验证器类都使用注入服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多