阅读Fluent Validators中的配置

时间:2019-01-22 18:33:21

标签: .net asp.net-core .net-core asp.net-core-2.1 fluentvalidation

我正在使用Fluent Validation 8验证模型。

我希望能够从Validator类中的appsettings.json中读取内容,但是未注入配置。

这是我的验证人:

 public class CreateOperationRequestValidator: AbstractValidator<OperationInputModel>
{
    private IConfiguration Configuration { get; set; }
    public CreateOperationRequestValidator(IConfiguration configuration)
    {


        CascadeMode = CascadeMode.StopOnFirstFailure;

        RuleFor(m => m.mode).NotEmpty().IsInEnum();
            ;

    }

但是我的配置为空。

我的创业公司是:

 services.AddSingleton<IConfiguration>(Configuration);

        services.AddMvc(opt =>
        {
            opt.Filters.Add(typeof(ValidatorActionFilter));
        }).AddFluentValidation(
            fvc => fvc.RegisterValidatorsFromAssemblyContaining<Startup>()
        );

2 个答案:

答案 0 :(得分:0)

为了注入类,这些类本身必须在服务集合中注册。 Fluent Validation很有可能不是 这样做的结果,因此您无能为力。换句话说,您在这里受到库本身的摆布,以及它如何在内部处理对象实例化和生存期。

同样值得一提的是,属性不能被注入,因为它们本质上是被实例化的。通常,这是属性的限制,而不仅仅是Microsoft.Extensions.DependencyInjection。我不确定您是否将过滤器用作属性,但很有可能Fluent Validation在这里不支持注入,仅仅是因为根据使用情况,注入不一致。

答案 1 :(得分:0)

您可以执行以下操作

使用所需的属性创建ConfigSettings模式类

public class ConfigSettings
{
   // get and set your setting properties here 
}

然后使用Microsoft.Extensions.Options在验证器构造函数参数中传递以下类似设置

public class CreateOperationRequestValidator: AbstractValidator<OperationInputModel>
{
    public CreateOperationRequestValidator(IOptions<ConfigSettings> settings)
    {


        CascadeMode = CascadeMode.StopOnFirstFailure;

        RuleFor(m => m.mode).NotEmpty().IsInEnum();
            ;

    }
}

您可以通过settings.Value来访问属性。{您的属性名称}

最后在Startup.cs中添加以下行

public void ConfigureServices(IServiceCollection services)
{
     services.AddOptions();
     services.Configure<ConfigSettings>(Configuration);
     services.Add(ServiceDescriptor.Transient(typeof(ConfigSettings), typeof(ConfigSettings)));

}