- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
众所周知,在 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/
我添加了一个这样的单例。 在 Startup.cs 中,我添加了以下内容: services.AddSingleton(); 我想像这样构建我的单例(当然这是不可能的): public class M
tl;博士 services.AddSingleton(); // SomeService not instantiated nor initialized? 在经典 SignalR Chat 应用程
当为使用 AddScoped 或 AddSingleton 添加的服务使用 DI 时,该服务是否需要实现 IDisposable(即使它没有使用任何非托管资源(如文件)? 从 Microsoft Do
我想模拟 IServiceCollection 以使用 Nsubstite 模拟库和 检查是否使用特定接口(interface)和具体类型调用了 AddSingleton xUnit. 这是我的单元测
为什么我应该为我的存储库或服务使用 AddScoped()?为什么不是 AddSingleton()?我知道它们之间的区别,但不明白为什么我不应该使用单例实例来避免为每个请求创建新对象。你能解释一下吗
为什么我应该为我的存储库或服务使用 AddScoped()?为什么不是 AddSingleton()?我知道它们之间的区别,但不明白为什么我不应该使用单例实例来避免为每个请求创建新对象。你能解释一下吗
考虑以下简单的 appsettings.json: { "maintenanceMode": true } 它加载在我的 Startup.cs/Configure(...) 方法中 public
我一直在通过程序类将我的依赖项注册到我的 IOC 容器中,但它变得困惑了。我决定编写一个 DI 提供程序,在其中提供并注册依赖项。 在我开始解释代码之前,这是 VS 给出的完整编译错误。 'Servi
我注意到在一些 .NET Core 示例中有对 TryAddSingleton 的调用,在一些 AddSingleton 中注册服务时。 如果服务类型尚未注册,反编译器显示 TryAdd(由 TryA
我想实现 dependency injection ASP.NET Core 中的 (DI)。因此,将此代码添加到 ConfigureServices 方法后,两种方式都有效。 ASP.NET Cor
在 asp.net 核心应用程序中,我有一个依赖注入(inject)缓存服务,它本质上是内置 MemoryCache 的包装器。 这是被缓存的示例类,它包含 Web 应用程序始终使用的一些枚举的列表:
众所周知,在 ASP.NET Core 2 中有两种获取选项类的方法: 使用 services.Configure<>()像这样: services.AddOption(); services.Con
我正在学习如何将 MongoDB 与 C# ASP.NET 一起使用,并且我一直在遵循 Microsoft 关于使用 MongoDB 的指南 Mongo Doc Guide .我已经进入添加配置模型部
我正在学习如何将 MongoDB 与 C# ASP.NET 一起使用,并且我一直在遵循 Microsoft 关于使用 MongoDB 的指南 Mongo Doc Guide .我已经进入添加配置模型部
看完this帖子我可以理解 AddTransient、AddScoped 和 AddSingleton 之间的区别,但是,我看不到它们每个的实际用法。 我的理解是 添加 transient 每次客户端
我只需添加以下内容即可访问 .NET Core 2 Web API Controller 中的 appsettings.json: public class MyController : Contro
在 ASP.NET Core 2.1 中注册自定义托管服务的正确方法是什么?例如,我有一个派生自 BackgroundService 的自定义托管服务名为 MyHostedService。我该如何注册
我正在使用 StackExchange.Redis 添加到 .NET Core 的 Redis 连接,它目前看起来像这样: public static IServiceCollection AddRe
我是一名优秀的程序员,十分优秀!