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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }