using System.Collections.Generic; using Microsoft.Extensions.Options; using Oqtane.Models; namespace Oqtane.Infrastructure { public class SiteOptionsFactory : IOptionsFactory where TOptions : class, new() where TAlias : class, IAlias, new() { private readonly IConfigureOptions[] _configureOptions; private readonly IPostConfigureOptions[] _postConfigureOptions; private readonly IValidateOptions[] _validations; private readonly ISiteOptions[] _siteOptions; private readonly IAliasAccessor _aliasAccessor; public SiteOptionsFactory(IEnumerable> configureOptions, IEnumerable> postConfigureOptions, IEnumerable> validations, IEnumerable> siteOptions, IAliasAccessor aliasAccessor) { _configureOptions = configureOptions as IConfigureOptions[] ?? new List>(configureOptions).ToArray(); _postConfigureOptions = postConfigureOptions as IPostConfigureOptions[] ?? new List>(postConfigureOptions).ToArray(); _validations = validations as IValidateOptions[] ?? new List>(validations).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 as TAlias); } } // post configuration foreach (var post in _postConfigureOptions) { post.PostConfigure(name, options); } //if (_validations.Length > 0) //{ // var failures = new List(); // foreach (IValidateOptions validate in _validations) // { // ValidateOptionsResult result = validate.Validate(name, options); // if (result != null && result.Failed) // { // failures.AddRange(result.Failures); // } // } // if (failures.Count > 0) // { // throw new OptionsValidationException(name, typeof(TOptions), failures); // } //} return options; } } }