using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace zero.Architecture; internal class ZeroPluginInitializer { /// /// Adds a zero plugin /// public static void AddPlugin(IServiceCollection services, IConfiguration configuration) where T : class, IZeroPlugin, new() { AssemblyDiscovery.Current.AddAssembly(typeof(T).Assembly); services.AddSingleton(); AddPluginServices(services, configuration); } /// /// Adds a zero plugin /// public static void AddPlugin(IServiceCollection services, IConfiguration configuration, Func implementationFactory) where T : class, IZeroPlugin, new() { AssemblyDiscovery.Current.AddAssembly(typeof(T).Assembly); services.AddSingleton(implementationFactory); AddPluginServices(services, configuration); } /// /// Creates a temporary instance of the plugin to add additional services /// /// static void AddPluginServices(IServiceCollection services, IConfiguration configuration) where T : class, IZeroPlugin, new() { try { T plugin = new(); plugin.ConfigureServices(services, configuration); services.Configure(opts => plugin.Configure(opts)); } catch { throw new Exception($"Plugin \"{nameof(T)}\" needs an additional parameterless constructor as ConfigureServices() is called before the DI container is built"); } } }