【问题标题】:Model validation for configuration objects in ASP.NET CoreASP.NET Core 中配置对象的模型验证
【发布时间】:2019-08-31 03:40:29
【问题描述】:

在 .NET Core 中,如果我的 appsettings 文件看起来像

{
  "Section": {
    "Field": "value"
  }
}

我可以创建一个类

public class Section
{
    public string Field { get; set; }
}

并在 Startup 中检索值

public void ConfigureServices(IServiceCollection services) {
    services.Configure<Section>(this.Configuration.GetSection("Section"));
}

问题在于,如果由于某种原因(比如拼写错误)绑定失败,它不会抛出异常,而是会创建一个 Section 对象,其 Field 属性的值为 null(默认)。

如果绑定失败,有没有办法让services.Configure&lt;Section&gt;(this.Configuration.GetSection("Section")); 抛出?

【问题讨论】:

标签: c# asp.net-core


【解决方案1】:

我只是在总结@Nkosi 的答案here,这使得使用数据注释可以进行此验证。

1- 注释类的属性:

public class Section
{
    [Required]
    public string Field { get; set; }
}

2- 创建扩展方法使验证生效:

public static class ConfigurationModelValidation
{
    public static T GetValid<T>(this IConfiguration configuration)
    {
        var obj = configuration.Get<T>();
        Validator.ValidateObject(obj, new ValidationContext(obj), true);
        return obj;
    }
}

3- 在Startup 类中,使用GetValid 方法(而不是使用'IOptions')注册您的配置模型如下:

public void ConfigureServices(IServiceCollection services) {
    services.AddSingleton(this.Configuration.GetSection("Section").GetValid<Section>());
}

4- 现在在用户类中直接注入您的配置模型:

public class MyClass
{
    private readonly string field;

    public MyClass(Section section)
    {
        this.field = section.field;
    }
}

现在,如果绑定因任何原因失败,验证将启动并抛出,享受吧!

【讨论】:

  • 是的,这或多或少是它的要点。
【解决方案2】:

您可以先获取该部分,然后验证它是否存在(因为它不会是null)。

public void ConfigureServices(IServiceCollection services) {
    var section = this.Configuration.GetSection(nameof(Section));
    if (!section.Exists()) throw new Exception();
    services.Configure<Section>(section);
}

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多