diff options
Diffstat (limited to 'src/main.lib/Services/PluginService.cs')
-rw-r--r-- | src/main.lib/Services/PluginService.cs | 110 |
1 files changed, 35 insertions, 75 deletions
diff --git a/src/main.lib/Services/PluginService.cs b/src/main.lib/Services/PluginService.cs index fff7fec..404e65d 100644 --- a/src/main.lib/Services/PluginService.cs +++ b/src/main.lib/Services/PluginService.cs @@ -14,103 +14,53 @@ namespace PKISharp.WACS.Services public class PluginService : IPluginService { private readonly List<Type> _allTypes; - - private readonly List<Type> _optionProviders; - - private readonly List<Type> _targetOptionFactories; - private readonly List<Type> _validationOptionFactories; - private readonly List<Type> _csrOptionFactories; - private readonly List<Type> _storeOptionFactories; - private readonly List<Type> _installationOptionFactories; - - private readonly List<Type> _target; - private readonly List<Type> _validation; - private readonly List<Type> _csr; - private readonly List<Type> _store; - private readonly List<Type> _installation; + private readonly List<Type> _argumentProviders; + private readonly List<Type> _optionFactories; + private readonly List<Type> _plugins; internal readonly ILogService _log; - public List<IArgumentsProvider> OptionProviders() + public IEnumerable<IArgumentsProvider> ArgumentsProviders() { - return _optionProviders.Select(x => + return _argumentProviders.Select(x => { var c = x.GetConstructor(new Type[] { }); return (IArgumentsProvider)c.Invoke(new object[] { }); }).ToList(); } - public List<ITargetPluginOptionsFactory> TargetPluginFactories(ILifetimeScope scope) => GetFactories<ITargetPluginOptionsFactory>(_targetOptionFactories, scope); - - public List<IValidationPluginOptionsFactory> ValidationPluginFactories(ILifetimeScope scope) => GetFactories<IValidationPluginOptionsFactory>(_validationOptionFactories, scope); - - public List<ICsrPluginOptionsFactory> CsrPluginOptionsFactories(ILifetimeScope scope) => GetFactories<ICsrPluginOptionsFactory>(_csrOptionFactories, scope); - - public List<IStorePluginOptionsFactory> StorePluginFactories(ILifetimeScope scope) => GetFactories<IStorePluginOptionsFactory>(_storeOptionFactories, scope); - - public List<IInstallationPluginOptionsFactory> InstallationPluginFactories(ILifetimeScope scope) => GetFactories<IInstallationPluginOptionsFactory>(_installationOptionFactories, scope); - - public ITargetPluginOptionsFactory TargetPluginFactory(ILifetimeScope scope, string name) => GetByName<ITargetPluginOptionsFactory>(_targetOptionFactories, name, scope); - - public IValidationPluginOptionsFactory ValidationPluginFactory(ILifetimeScope scope, string type, string name) - { - return _validationOptionFactories. - Select(scope.Resolve). - OfType<IValidationPluginOptionsFactory>(). - FirstOrDefault(x => x.Match(name) && string.Equals(type, x.ChallengeType, StringComparison.InvariantCultureIgnoreCase)); - } - - public ICsrPluginOptionsFactory CsrPluginFactory(ILifetimeScope scope, string name) => GetByName<ICsrPluginOptionsFactory>(_csrOptionFactories, name, scope); - - public IStorePluginOptionsFactory StorePluginFactory(ILifetimeScope scope, string name) => GetByName<IStorePluginOptionsFactory>(_storeOptionFactories, name, scope); - - public IInstallationPluginOptionsFactory InstallationPluginFactory(ILifetimeScope scope, string name) => GetByName<IInstallationPluginOptionsFactory>(_installationOptionFactories, name, scope); - - public List<Type> PluginOptionTypes<T>() where T : PluginOptions => GetResolvable<T>(); + public IEnumerable<Type> PluginOptionTypes<T>() where T : PluginOptions => GetResolvable<T>(); internal void Configure(ContainerBuilder builder) { - _targetOptionFactories.ForEach(t => builder.RegisterType(t).SingleInstance()); - _validationOptionFactories.ForEach(t => builder.RegisterType(t).SingleInstance()); - _csrOptionFactories.ForEach(t => builder.RegisterType(t).SingleInstance()); - _storeOptionFactories.ForEach(t => builder.RegisterType(t).SingleInstance()); - _installationOptionFactories.ForEach(t => builder.RegisterType(t).SingleInstance()); - - _target.ForEach(ip => builder.RegisterType(ip)); - _validation.ForEach(ip => builder.RegisterType(ip)); - _csr.ForEach(ip => builder.RegisterType(ip)); - _store.ForEach(ip => builder.RegisterType(ip)); - _installation.ForEach(ip => builder.RegisterType(ip)); + _optionFactories.ForEach(t => builder.RegisterType(t).SingleInstance()); + _plugins.ForEach(ip => builder.RegisterType(ip)); } - private List<T> GetFactories<T>(List<Type> source, ILifetimeScope scope) where T : IPluginOptionsFactory => source.Select(scope.Resolve).OfType<T>().OrderBy(x => x.Order).ToList(); + public IEnumerable<T> GetFactories<T>(ILifetimeScope scope) where T : IPluginOptionsFactory => _optionFactories.Select(scope.Resolve).OfType<T>().OrderBy(x => x.Order).ToList(); - private T GetByName<T>(IEnumerable<Type> list, string name, ILifetimeScope scope) where T : IPluginOptionsFactory => list.Select(scope.Resolve).OfType<T>().FirstOrDefault(x => x.Match(name)); + private IEnumerable<T> GetByName<T>(string name, ILifetimeScope scope) where T : IPluginOptionsFactory => GetFactories<T>(scope).Where(x => x.Match(name)); public PluginService(ILogService logger) { _log = logger; _allTypes = GetTypes(); - _optionProviders = GetResolvable<IArgumentsProvider>(); - - _targetOptionFactories = GetResolvable<ITargetPluginOptionsFactory>(); - _validationOptionFactories = GetResolvable<IValidationPluginOptionsFactory>(); - _csrOptionFactories = GetResolvable<ICsrPluginOptionsFactory>(); - _storeOptionFactories = GetResolvable<IStorePluginOptionsFactory>(true); - _installationOptionFactories = GetResolvable<IInstallationPluginOptionsFactory>(true); - - _target = GetResolvable<ITargetPlugin>(); - _validation = GetResolvable<IValidationPlugin>(); - _csr = GetResolvable<ICsrPlugin>(); - _store = GetResolvable<IStorePlugin>(); - _installation = GetResolvable<IInstallationPlugin>(); - - ListPlugins(_target, "target"); - ListPlugins(_validation, "validation"); - ListPlugins(_csr, "csr"); - ListPlugins(_store, "store"); - ListPlugins(_installation, "installation"); + _argumentProviders = GetResolvable<IArgumentsProvider>(); + _optionFactories = GetResolvable<IPluginOptionsFactory>(true); + _plugins = new List<Type>(); + void AddPluginType<T>(string name) + { + var temp = GetResolvable<T>(); + ListPlugins(temp, name); + _plugins.AddRange(temp); + } + AddPluginType<ITargetPlugin>("target"); + AddPluginType<IValidationPlugin>("validation"); + AddPluginType<IOrderPlugin>("order"); + AddPluginType<ICsrPlugin>("csr"); + AddPluginType<IStorePlugin>("store"); + AddPluginType<IInstallationPlugin>("installation"); } private void ListPlugins(IEnumerable<Type> list, string type) @@ -257,5 +207,15 @@ namespace PKISharp.WACS.Services } return ret.ToList(); } + + public T GetFactory<T>(ILifetimeScope scope, string name, string? parameter = null) where T : IPluginOptionsFactory + { + var plugins = GetByName<T>(name, scope); + if (typeof(T) is IValidationPluginOptionsFactory) + { + plugins = plugins.Where(x => string.Equals(parameter, (x as IValidationPluginOptionsFactory)?.ChallengeType, StringComparison.InvariantCultureIgnoreCase)); + } + return plugins.FirstOrDefault(); + } } } |