为什么 .NET Core 选项的配置不适用于泛型类型参数?

Ema*_*aro 7 c# dependency-injection appsettings .net-core asp.net-core-webapi

我有一个 .NET Core WebApi 项目。为了以简单的方式读取应用设置,我配置了要注入 DI 的选项。这工作正常。但是,如果我尝试Configure<>()使用泛型类型参数进行调用,则会出现错误。

参数 2:无法从“Microsoft.Extensions.Configuration.IConfigurationSection”转换为“System.Action”

除了方法重载Configure<T>(Action<T> configureOptions)似乎不再可用。

为什么调用不适用于泛型类型参数?

启动文件

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // services.AddMvc() etc...

        services.AddOptions();

        // Works fine
        services.Configure<MyOption>(Configuration.GetSection(nameof(MyOption)));
    }

    private void AddOption<T>(IServiceCollection services)
    {
        // Wont work
        services.Configure<T>(Configuration.GetSection(nameof(T)));
        services.Configure<T>(Configuration.GetSection(""));
    }
}
Run Code Online (Sandbox Code Playgroud)

MyOption.cs

public class MyOption
{
    public bool MyProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

appsettings.json

{
    "MyOption": {
        "MyProp": true
    }
}
Run Code Online (Sandbox Code Playgroud)

Igo*_*ova 8

你需要AddOption像这样改变你的功能:

private void AddOption<T>(IServiceCollection services) where T : class 
{
    services.Configure<T>(Configuration.GetSection(typeof(T).Name));
}
Run Code Online (Sandbox Code Playgroud)

where T : class你在方法声明中忘记了

之后你可以像这样使用这个方法:

AddOption<MyOption>(services);
Run Code Online (Sandbox Code Playgroud)


aks*_*vel 7

您需要使用 services.Configure 如下:

services.Configure<MyOption>(setting =>
{  
    Configuration.GetSection("MyOption").Bind(setting);  
});  
Run Code Online (Sandbox Code Playgroud)