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");
}
}
}