众所周知,在 ASP.NET Core 2 中有两种获取选项类的方法:
使用
services.Configure<>()
像这样:services.AddOption(); services.Configure<ApplicationOptions>(Configuration.GetSection("applicationSettings"));
或使用
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/