using System.Collections.Generic; using Microsoft.Extensions.Options; 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 IAliasAccessor _aliasAccessor; public SiteOptionsFactory(IEnumerable> configureOptions, IEnumerable> postConfigureOptions, IEnumerable> siteOptions, IAliasAccessor aliasAccessor) { _configureOptions = configureOptions as IConfigureOptions[] ?? new List>(configureOptions).ToArray(); _postConfigureOptions = postConfigureOptions as IPostConfigureOptions[] ?? new List>(postConfigureOptions).ToArray(); _siteOptions = siteOptions as ISiteOptions[] ?? new List>(siteOptions).ToArray(); _aliasAccessor = aliasAccessor; } 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 (_aliasAccessor?.Alias != null) { foreach (var siteOption in _siteOptions) { siteOption.Configure(options, _aliasAccessor.Alias); } } // post configuration foreach (var post in _postConfigureOptions) { post.PostConfigure(name, options); } return options; } } }