• .NET Core-插件如何读取指定配置结点


    先看效果

    appsettings.json

    {
      "Plugin1": {
        "Test1": "11111111"
      },
      "Plugin2": {
        "Test2": "22222222"
      }
    }
    

    为每个节点创建Option

        public class Service1Options
        {
            public string Test1 { get; set; }
        }
        public class Service2Options
        {
            public string Test2 { get; set; }
        }
    

    插件,每个插件注入对应的Option

        public class Plugin1 : IPlugin
        {
            public Plugin1(IOptions<Service1Options> options)
            {
                Service1Options option = options.Value;//11111111
            }
        }
        public class Plugin2 : IPlugin
        {
            public Plugin2(IOptions<Service2Options> options)
            {
                Service2Options option = options.Value;//22222222
            }
        }
    

    如何实现?

    插件接口

        public interface IPlugin
        { }
    

    插件节点获取器

        /// <summary>
        /// Plugin配置节点获取器
        /// </summary>
        /// <typeparam name="TPlugin"></typeparam>
        public interface IPluginConfigurationProvider<TPlugin>
        {
            public IConfiguration Configuration { get; }
        }
        public class PluginConfigurationProvider<TPlugin> : IPluginConfigurationProvider<TPlugin>
            where TPlugin : IPlugin
        {
            public IConfiguration Configuration { get; set; }
            public PluginConfigurationProvider(IConfiguration configuration)
            {
                string sectionName = typeof(TPlugin).Name;
                var section = configuration.GetSection(sectionName);
                if (section != null)
                {
                    Configuration = section;
                }
            }
        }
    

    从配置中获取插件设置

        /// <summary>
        /// 从配置中获取插件设置
        /// </summary>
        /// <typeparam name="TPlugin">插件类型</typeparam>
        /// <typeparam name="TPluginOptions">插件设置</typeparam>
        public class PluginConfigrationOptions<TPlugin, TPluginOptions> : ConfigureFromConfigurationOptions<TPluginOptions>
        where TPluginOptions : class, new()
        {
            public PluginConfigrationOptions(IPluginConfigurationProvider<TPlugin> provider) : base(provider.Configuration)
            {
            }
        }
    

    Startup

            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllersWithViews();
                services.AddTransient<IConfigureOptions<Service1Options>, PluginConfigrationOptions<Plugin1, Service1Options>>();
                services.AddTransient<IConfigureOptions<Service2Options>, PluginConfigrationOptions<Plugin2, Service2Options>>();
                services.AddTransient(typeof(IPluginConfigurationProvider<>), typeof(PluginConfigurationProvider<>));
                services.AddTransient<Plugin1>();
                services.AddTransient<Plugin2>();
                var provider = services.BuildServiceProvider();
                var service1 = provider.GetRequiredService<Plugin1>();//1111111
                var service2 = provider.GetRequiredService<Plugin2>();//2222222
            }
    
  • 相关阅读:
    企业级监控平台开发之nagios二次开发(七)
    ndoutils2.2.0(ndo2db)中文乱码问题解决
    CloudStack系统部署系列教程-KVM
    NDO to PNP( ndoutils to PNP4Nagios)
    nagios二次开发(六)---nagiosql原理及主要文件的介绍
    [转]配置sonar、jenkins进行持续审查
    Error: Cannot open main configuration file '//start' for reading! 解决办法
    Maven学习第4期---Maven简单使用
    Java多线程学习(四)---控制线程
    Java多线程学习(三)---线程的生命周期
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/15348835.html
Copyright © 2020-2023  润新知