public static IServiceProvider Configure(IServiceCollection services) { // register config services.Add(new ServiceDescriptor(typeof(IConfigurationProvider), new IniConfiguration(Path.Combine(Directory.GetCurrentDirectory(), "sir.ini")))); // register plugins var assemblyPath = Directory.GetCurrentDirectory(); #if DEBUG assemblyPath = Path.Combine(Directory.GetCurrentDirectory(), "bin\\Debug\\netcoreapp2.1"); #endif var files = Directory.GetFiles(assemblyPath, "*.plugin.dll"); foreach (var assembly in files.Select(file => AssemblyLoadContext.Default.LoadFromAssemblyPath(file))) { foreach (var type in assembly.GetTypes()) { // search for concrete implementations if (!type.IsInterface) { var interfaces = type.GetInterfaces(); if (interfaces.Contains(typeof(IPluginStop)) || interfaces.Contains(typeof(IPluginStart)) || interfaces.Contains(typeof(IPlugin))) { // register plugins, startup and teardown services foreach (var contract in interfaces.Where(t => t != typeof(IDisposable))) { services.Add(new ServiceDescriptor( contract, type, ServiceLifetime.Singleton)); } } } } } var plugins = new PluginsCollection(); services.Add(new ServiceDescriptor(typeof(PluginsCollection), plugins)); var serviceProvider = services.BuildServiceProvider(); // initiate plugins foreach (var service in serviceProvider.GetServices <IPluginStart>()) { service.OnApplicationStartup(services, serviceProvider); } // Create one instances each of all plugins and register them with the PluginCollection, // so that they can be fetched at runtime by Content-Type and System.Type. foreach (var service in services.BuildServiceProvider().GetServices <IWriter>()) { plugins.Add(service.ContentType, service); } foreach (var service in services.BuildServiceProvider().GetServices <IReader>()) { plugins.Add(service.ContentType, service); } return(services.BuildServiceProvider()); }
public static IServiceProvider Configure(IServiceCollection services) { var assemblyPath = Directory.GetCurrentDirectory(); var config = new KeyValueConfiguration(Path.Combine(assemblyPath, "sir.ini")); // register config services.Add(new ServiceDescriptor(typeof(IConfigurationProvider), config)); // register plugin startup and teardown handlers #if DEBUG var frameworkVersion = AppContext.TargetFrameworkName.Substring(AppContext.TargetFrameworkName.IndexOf("=v") + 2); assemblyPath = Path.Combine(assemblyPath, "bin", "Debug", $"netcoreapp{frameworkVersion}"); #endif var files = Directory.GetFiles(assemblyPath, "*.plugin.dll"); foreach (var assembly in files.Select(file => AssemblyLoadContext.Default.LoadFromAssemblyPath(file))) { foreach (var type in assembly.GetTypes()) { // search for concrete types if (!type.IsInterface) { var interfaces = type.GetInterfaces(); if (interfaces.Contains(typeof(IPluginStop))) { services.Add(new ServiceDescriptor(typeof(IPluginStop), type, ServiceLifetime.Singleton)); } else if (interfaces.Contains(typeof(IPluginStart))) { services.Add(new ServiceDescriptor(typeof(IPluginStart), type, ServiceLifetime.Singleton)); } } } } var plugins = new PluginsCollection(); services.Add(new ServiceDescriptor(typeof(PluginsCollection), plugins)); var serviceProvider = services.BuildServiceProvider(); // raise startup event foreach (var service in serviceProvider.GetServices <IPluginStart>()) { service.OnApplicationStartup(services, serviceProvider, config); } // Fetch one instance each of all plugins and register them with the PluginCollection // so that they can be fetched at runtime by Content-Type and System.Type. foreach (var service in services.BuildServiceProvider().GetServices <IHttpWriter>()) { plugins.Add(service.ContentType, service); } foreach (var service in services.BuildServiceProvider().GetServices <IHttpReader>()) { plugins.Add(service.ContentType, service); } RegisterComponents(services, plugins, services.BuildServiceProvider()); return(services.BuildServiceProvider()); }