From 93cee2661484ebc292a56a02405f36551bbe2eaf Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 19 Mar 2021 08:16:51 -0700 Subject: [PATCH] Slimmer IOptions (#49852) * Slimmer IOptions - Use a Lazy instead of the IOptionsCache (which is a concurrent dictionary) --- .../src/OptionsServiceCollectionExtensions.cs | 2 +- .../src/UnnamedOptionsManager.cs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/libraries/Microsoft.Extensions.Options/src/UnnamedOptionsManager.cs diff --git a/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs b/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs index d9ff1e7..cfba973 100644 --- a/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs @@ -26,7 +26,7 @@ namespace Microsoft.Extensions.DependencyInjection throw new ArgumentNullException(nameof(services)); } - services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(OptionsManager<>))); + services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(UnnamedOptionsManager<>))); services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>))); services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>))); services.TryAdd(ServiceDescriptor.Transient(typeof(IOptionsFactory<>), typeof(OptionsFactory<>))); diff --git a/src/libraries/Microsoft.Extensions.Options/src/UnnamedOptionsManager.cs b/src/libraries/Microsoft.Extensions.Options/src/UnnamedOptionsManager.cs new file mode 100644 index 0000000..6920efe --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Options/src/UnnamedOptionsManager.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Diagnostics.CodeAnalysis; + +namespace Microsoft.Extensions.Options +{ + internal class UnnamedOptionsManager<[DynamicallyAccessedMembers(Options.DynamicallyAccessedMembers)] TOptions> : + IOptions + where TOptions : class + { + private readonly Lazy _lazy; + + public UnnamedOptionsManager(IOptionsFactory factory) + { + _lazy = new Lazy(() => factory.Create(Options.DefaultName)); + } + + public TOptions Value => _lazy.Value; + } +} -- 2.7.4