using System.Collections.Generic; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; using Oqtane.Extensions; namespace Oqtane.Infrastructure { public class SiteOptionsFactory : IOptionsFactory where TOptions : class, new() { private readonly IConfigureOptions[] _configureOptions; private readonly IPostConfigureOptions[] _postConfigureOptions; private readonly ISiteOptions[] _siteOptions; private readonly ISiteNamedOptions[] _siteNamedOptions; private readonly IHttpContextAccessor _accessor; public SiteOptionsFactory(IEnumerable> configureOptions, IEnumerable> postConfigureOptions, IEnumerable> siteOptions, IEnumerable> siteNamedOptions, IHttpContextAccessor accessor) { _configureOptions = configureOptions as IConfigureOptions[] ?? new List>(configureOptions).ToArray(); _postConfigureOptions = postConfigureOptions as IPostConfigureOptions[] ?? new List>(postConfigureOptions).ToArray(); _siteOptions = siteOptions as ISiteOptions[] ?? new List>(siteOptions).ToArray(); _siteNamedOptions = siteNamedOptions as ISiteNamedOptions[] ?? new List>(siteNamedOptions).ToArray(); _accessor = accessor; } public TOptions Create(string name) { // default options var options = new TOptions(); foreach (var setup in _configureOptions) { if (setup is IConfigureNamedOptions namedSetup) { namedSetup.Configure(name, options); } else if (name == Options.DefaultName) { setup.Configure(options); } } // override with site specific options if (_accessor.HttpContext?.GetAlias() != null && _accessor.HttpContext?.GetSiteSettings() != null) { foreach (var siteOption in _siteOptions) { siteOption.Configure(options, _accessor.HttpContext.GetAlias(), _accessor.HttpContext.GetSiteSettings()); } foreach (var siteNamedOption in _siteNamedOptions) { siteNamedOption.Configure(name, options, _accessor.HttpContext.GetAlias(), _accessor.HttpContext.GetSiteSettings()); } } // post configuration foreach (var post in _postConfigureOptions) { post.PostConfigure(name, options); } return options; } } }