【问题标题】:Read from Configuration in Fluent Validators从 Fluent Validators 中的配置读取
【发布时间】:2019-06-16 06:56:04
【问题描述】:

我正在使用 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>()
        );

【问题讨论】:

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


    【解决方案1】:

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

    还值得一提的是,属性不能被注入,因为它们本质上是就地实例化的。这是一般属性的限制,而不仅仅是Microsoft.Extensions.DependencyInjection。我不确定您是否将过滤器用作属性,但 Fluent Validation 很可能不支持此处的注入,仅仅是因为它根据用例而不一致。

    【讨论】:

      【解决方案2】:

      你可以这样做

      使用所需的属性创建一个 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.{your property name} 访问属性

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-06
        • 2012-05-17
        • 1970-01-01
        相关资源
        最近更新 更多