c# - services.Configure<>() 还是 services.AddSingleton().Get()?

标签 c# asp.net-core configuration

众所周知,在 ASP.NET Core 2 中有两种获取选项类的方法:

  1. 使用 services.Configure<>()像这样:

    services.AddOption();
    services.Configure<ApplicationOptions>(Configuration.GetSection("applicationSettings"));
    
  2. 或使用 services.AddSingleton(Configuration.Get())像这样:

    services.AddSingleton(Configuration.GetSection("applicationSettings")
        .Get<ApplicationOptions>());
    

但是这些不同的方法有哪些优点或缺点?

最佳答案

使用 Configure<ApplicationOptions>允许 options pattern .选项模式是使用各种配置源配置事物的好方法。在您的示例中,您正在配置 ApplicationOptions使用 Microsoft.Extensions.Configuration 源。但您也可以同时通过其他来源对其进行配置:

// configure using configuration
services.Configure<ApplicationOptions>(Configuration.GetSection("applicationSettings"));

// then apply a configuration function
services.Configure<ApplicationOptions>(options =>
{
    // overwrite previous values
    options.Foo = "bar";
});

还有一些其他方法可以调整配置,例如使用后配置,它允许您轻松地组合使用选项但可能需要建立某些默认值或回退的东西。

选项对象将在使用时进行配置,因此当您调用 services.Configure() 时,当时实际上没有任何配置。相反,配置是在 DI 容器中注册的。然后,当解决选项解决时,将调用某种类型的所有配置(允许构图)。这允许选项也支持更新配置;所以当你更新你的 appsettings.json在运行时,选项能够接收更新的值。

为了消费选项,你需要注入(inject)IOptions<ApplicationOptions> (或 IOptionsSnapshot<ApplicationOptions> 如果您需要更新选项)。这是选项对象的包装器,它将调用选项模式。


另一方面,调用 AddSingleton<ApplicationOptions>只是将一个单例实例注册为一个固定值。所以向 DI 提供者注册的是任何值 Configuration.GetSection("applicationSettings").Get<ApplicationOptions>() 在那一刻返回

这样做的好处是您不需要使用选项模式;而不是必须注入(inject) IOptions<ApplicationOptions>进入你的类型,你可以只依赖 ApplicationOptions直接地。所以你不依赖 Options 框架。这对于希望在默认情况下选项模式可能不可用的不同场景中使用的独立库非常有用。

但是,由于这注册了一个固定的实例,因此您也只能使用那些确切的值。当配置源更改时,您不能稍后更新这些值,也不能将一个配置源与其他配置结合使用。

关于c# - services.Configure<>() 还是 services.AddSingleton().Get()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53424593/

相关文章:

asp.net-core - 用于授权和身份验证的多个 JWT 承载

configuration - 软件配置管理如何帮助改进项目管理?

java - Ehcache web CacheManager.replaceCacheWithDecoratedCache 抛出 NPE

c# - 将指针编码到字符串数组

asp.net-core - "When using a scoped service, inject the service into the Invoke or InvokeAsync"是什么意思?

c# - 信用卡方程式(C#)

c# - .NET Core 2.0 Web API 中的 BSON

database - 在哪里放置我需要的 Symfony2 自定义参数?

c# - OxyPlot,不在 LineSeries 中的点

c# - 在 C# 中优化尾调用