internal static ServiceConfigurations Find(Configuration config, ILogger logger) { logger.Information("Loading configuration", PluginDir); var configurations = new ServiceConfigurations(logger); AddInternalConfigurations(); AddExternalPlugins(); return(configurations); void AddInternalConfigurations() { logger.Information("Loading internal service configuration", PluginDir); var loader = Factory.CreateLoader(config, logger).Result; var addData = new SetData(loader, logger); configurations.Add(new Singletons()); configurations.Add(addData); if (config.EnablePrometheusMonitoring) { configurations.Add(new ServiceConfiguration.Prometheus()); } configurations.Add(new HealthCheck(addData, config.EnablePrometheusMonitoring)); configurations.Add(new Swagger()); configurations.Add(new ExceptionHandler()); } void AddExternalPlugins() { if (!config.EnableCustomPlugins) { return; } try { logger.Information("Loading external plugins from {path}", PluginDir); var conventions = new ConventionBuilder(); conventions.ForTypesDerivedFrom <IPlugin>().Export <IPlugin>().Shared(); var containerConfig = new ContainerConfiguration().WithAssembliesInPath(PluginDir, conventions); using var container = containerConfig.CreateContainer(); var externalPlugins = container.GetExports <IPlugin>(); configurations.AddRange(externalPlugins); } catch (Exception e) { logger.Warning(e, "Error loading plugins from {path}", PluginDir); } } }
public void AddRangeSetsLogger() { var plugin1 = Substitute.For <IPlugin>(); var plugin2 = Substitute.For <IPlugin>(); var logger = Substitute.For <ILogger>(); var configurations = new ServiceConfigurations(logger); configurations.AddRange(new [] { plugin1, plugin2 }); plugin1.Logger.Should().Be(logger); plugin2.Logger.Should().Be(logger); }