public static IServiceCollection AddPluginFactory(this IServiceCollection services, IConfiguration configuration, IEnumerable <Assembly> assemblies) { if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } //注入配置 PluginFactoryConfigration factoryConfigration = new PluginFactoryConfigration(configuration); services.TryAddSingleton(factoryConfigration); // 从配置中获取设置 PluginFactoryOptions options = createDefaultOptions(); if (assemblies != null) { foreach (var a in assemblies) { if (a == null) { continue; } options.AddAssembly(a); } } options.ConfigFromConfigration(factoryConfigration); services.AddPluginFactory(options, configuration); return(services); }
private static IPluginLoader createPluginLoader(IServiceCollection services, PluginFactoryOptions options) { IPluginLoader loader = new DefaultPluginLoader(options, services); loader.Load(); foreach (PluginInfo pi in loader.PluginList) { if (!pi.IsEnable) { continue; } services.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IPlugin), pi.PluginType)); } // 注入配置映射 var list = loader.PluginList.Where(x => x.CanConfig && x.IsEnable).ToList(); foreach (PluginInfo pi in list) { Type cfgOptionsType = typeof(IConfigureOptions <>).MakeGenericType(pi.ConfigType); Type impleType = typeof(PluginConfigrationOptions <,>).MakeGenericType(pi.PluginType, pi.ConfigType); services.TryAddEnumerable(ServiceDescriptor.Singleton(cfgOptionsType, impleType)); } loader.Init(); return(loader); }
public static IServiceCollection AddPluginFactory(this IServiceCollection services, IConfiguration configuration, Action <PluginFactoryOptions> configureOptions) { PluginFactoryOptions options = createDefaultOptions(); if (configureOptions != null) { configureOptions(options); } services.AddPluginFactory(options, configuration); return(services); }
private static PluginFactoryOptions createDefaultOptions() { string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DEFAULT_PLUGIN_PATH); // 默认设置 PluginFactoryOptions options = new PluginFactoryOptions() { PluginPath = pluginPath }; if (Directory.Exists(pluginPath)) { options.FileProvider = new PhysicalFileProvider(pluginPath); } return(options); }
public void Test2() { PluginFactoryOptions options = new PluginFactoryOptions(); IServiceCollection services = new ServiceCollection(); options.PluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); options.FileProvider = new PhysicalFileProvider(options.PluginPath); IPluginLoader loader = new DefaultPluginLoader(options, services); loader.Load(); Assert.Equal(4, loader.PluginList.Count); Assert.Equal(4, loader.PluginList.Count); var pi = loader.PluginList.First(p => p.Alias == "TestPlugin"); Assert.Equal("TestPlugin", pi.Name); Assert.True(pi.IsEnable); Assert.False(pi.CanInit); Assert.False(pi.CanConfig); pi = loader.PluginList.First(p => p.Alias == "TestInitPlugin"); Assert.Equal("TestInitPlugin", pi.Name); Assert.True(pi.IsEnable); Assert.True(pi.CanInit); Assert.False(pi.CanConfig); pi = loader.PluginList.First(p => p.Alias == "TestConfigPlugin"); Assert.Equal("TestConfigPlugin", pi.Name); Assert.True(pi.IsEnable); Assert.False(pi.CanInit); Assert.True(pi.CanConfig); Assert.Equal("TestPluginA.TestConfigPluginOptions", pi.ConfigType.FullName); pi = loader.PluginList.First(p => p.Alias == "TestConfigPluginWithInit"); Assert.Equal("TestConfigPluginWithInit", pi.Name); Assert.True(pi.IsEnable); Assert.True(pi.CanInit); Assert.True(pi.CanConfig); Assert.Equal("TestPluginA.TestConfigPluginWithInitOptions", pi.ConfigType.FullName); }
public void Test1() { PluginFactoryOptions options = new PluginFactoryOptions(); IServiceCollection services = new ServiceCollection(); options.PluginPath = AppDomain.CurrentDomain.BaseDirectory; options.FileProvider = new PhysicalFileProvider(options.PluginPath); options.AddAssembly(Assembly.GetExecutingAssembly()); IPluginLoader loader = new DefaultPluginLoader(options, services); loader.Load(); Assert.Equal(4, loader.PluginList.Count); var pi = loader.PluginList.First(p => p.PluginType == typeof(TestPluginB)); Assert.True(pi.IsEnable); Assert.False(pi.CanInit); Assert.False(pi.CanConfig); pi = loader.PluginList.First(p => p.PluginType == typeof(TestPluginC)); Assert.True(pi.IsEnable); Assert.True(pi.CanInit); Assert.False(pi.CanConfig); pi = loader.PluginList.First(p => p.PluginType == typeof(TestPluginD)); Assert.True(pi.IsEnable); Assert.False(pi.CanInit); Assert.True(pi.CanConfig); Assert.Equal(typeof(TestPluginDOptions), pi.ConfigType); pi = loader.PluginList.First(p => p.PluginType == typeof(TestPluginE)); Assert.True(pi.IsEnable); Assert.True(pi.CanInit); Assert.True(pi.CanConfig); Assert.Equal(typeof(TestPluginEOptions), pi.ConfigType); }
public static IServiceCollection AddPluginFactory(this IServiceCollection services, PluginFactoryOptions options, IConfiguration configuration) { if (options == null) { throw new ArgumentNullException(nameof(options)); } services.AddLogging(); services.AddOptions(); services.TryAddSingleton(options); if (configuration == null) { configuration = new ConfigurationBuilder() .AddInMemoryCollection() .Build(); } // 配置根ConfigurationChangeTokenSource需要 services.TryAddSingleton <IConfiguration>(configuration); // 插件全局配置 services.TryAddSingleton(new PluginFactoryConfigration(configuration)); // 从配置中获取插件设置,以插件类型名称或插件别名作为配置键 services.TryAddSingleton(typeof(IPluginConfigrationProvider <>), typeof(PluginConfigrationProvider <>)); // 注册配置变更监听 services.TryAddSingleton(typeof(IOptionsChangeTokenSource <>), typeof(ConfigurationChangeTokenSource <>)); // 注入插件工厂 services.TryAddSingleton <IPluginFactory, DefaultPluginFactory>(); // 兼容托管服务,在宿主环境中自动调用开始和停止方法 services.AddHostedService((sp) => { IPluginFactory factory = sp.GetRequiredService <IPluginFactory>(); return(factory); }); IPluginLoader loader = createPluginLoader(services, options); // 载入器单例 services.TryAddSingleton(loader); return(services); }