c# – 在没有IOptions的情况下从appsettings.json中读取和使用设置?

.NET Core allows从配置文件中懒洋洋地读取设置,将其反序列化为POCO并使用一行代码在内置DI容器中注册该POCO:

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

然后任何消费者都可以解决IOptions< MyOptions>访问该POCO:

public HomeController(IOptions<MyOptions> optionsAccessor)
{
    MyOptions options = optionsAccessor.Value;
}

这种方法有明显的缺点:

> Microsoft.Extensions.Options包中不必要的依赖:
>模拟,测试和显式实例创建变得更加冗长.

解决没有IOptions< T>的选项的最简单方法是什么?

使用configuration.Get< TOptions>反序列化选项或者配置.绑定调用并在DI容器中将POCO显式注册为singleton:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingletonFromFile<MyOptions>(Configuration.GetSection("MySection"));
}

//...

public static IServiceCollection AddSingletonFromFile<TOptions>(
    this IServiceCollection services,
    IConfiguration configuration)
    where TOptions : class, new()
{
    //POCO is created with actual values 
    TOptions options = configuration.Get<TOptions>();

    services.AddSingleton(options);

    return services;
}

UPD:感谢@NPNelson .Get< TOptions>()提示.

然后IOptions< T>不再需要解析,并且类依赖性变得清晰:

public HomeController(MyOptions options)
{
    _options = options;
}

仅供参考:从外部服务(数据库等)读取也是可能的:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransientFromService<OptionsReader, MyOptions>(reader => reader.GetOptions());
}

//...

public static void AddTransientFromService<TReader, TOptions>(
    this IServiceCollection services,
    Func<TReader, TOptions> getOptions)
    where TReader : class
    where TOptions : class

{
    services.AddTransient(provider => getOptions(provider.GetService<TReader>()));
}

备注:

> Singleton不是懒惰的(它总是在启动时实例化);
>在单例注册的情况下,任何在运行时更新选项的能力都会丢失(.NET Core本身支持使用reloadOnChange选项设置重新加载运行时文件:.AddJsonFile(“appsettings.json”,false,reloadOnChange:true));

如果您确实需要重新加载文件但仍然不想使用IOptions,请考虑进行瞬态解析.当然,按请求解决可能会导致显着的性能下降.

https://stackoverflow.com/questions/43679665/read-and-use-settings-from-appsettings-json-without-ioptionst

转载注明原文:c# – 在没有IOptions的情况下从appsettings.json中读取和使用设置?