using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using Oqtane.Infrastructure; using Oqtane.Models; namespace Microsoft.Extensions.DependencyInjection { public partial class OqtaneSiteOptionsBuilder { public IServiceCollection Services { get; set; } public OqtaneSiteOptionsBuilder(IServiceCollection services) { Services = services; } public OqtaneSiteOptionsBuilder AddSiteOptions( Action> configureOptions) where TOptions : class, new() { Services.TryAddSingleton, SiteOptionsCache>(); Services.AddSingleton, SiteOptions> (_ => new SiteOptions(configureOptions)); Services.TryAddTransient, SiteOptionsFactory>(); Services.TryAddScoped>(sp => BuildOptionsManager(sp)); Services.TryAddSingleton>(sp => BuildOptionsManager(sp)); return this; } public OqtaneSiteOptionsBuilder AddSiteNamedOptions(string name, Action> configureOptions) where TOptions : class, new() { Services.TryAddSingleton, SiteOptionsCache>(); Services.AddSingleton, SiteNamedOptions>(_ => new SiteNamedOptions(name, configureOptions)); Services.TryAddTransient, SiteOptionsFactory>(); Services.TryAddScoped>(sp => BuildOptionsManager(sp)); Services.TryAddSingleton>(sp => BuildOptionsManager(sp)); return this; } private static SiteOptionsManager BuildOptionsManager(IServiceProvider sp) where TOptions : class, new() { var cache = ActivatorUtilities.CreateInstance(sp, typeof(SiteOptionsCache)); return (SiteOptionsManager)ActivatorUtilities.CreateInstance(sp, typeof(SiteOptionsManager), new[] { cache }); } } }