zoukankan      html  css  js  c++  java
  • .net core 使用IOptionsXXX读取配置

    add following packages

      <ItemGroup>
        <PackageReference Include="microsoft.extensions.configuration" Version="6.0.0" />
        <PackageReference Include="microsoft.extensions.configuration.binder" Version="6.0.0" />
        <PackageReference Include="microsoft.extensions.configuration.json" Version="6.0.0" />
        <PackageReference Include="microsoft.extensions.dependencyinjection" Version="6.0.0" />
        <PackageReference Include="microsoft.extensions.options" Version="6.0.0" />
      </ItemGroup>
    

    sample code

    class Config
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Proxy Proxy { get; set; }
    
        public override string ToString()
        {
            return $"name:{Name}, age:{Age}, proxy:{Proxy}";
        }
    }
    
    class Proxy
    {
        public string Server { get; set; }
        public int Port { get; set; }
    
        public override string ToString()
        {
            return $"server:{Server}, port:{Port}";
        }
    }
    
    class TestController
    {
        // IOptions: 只读配置,不追踪变化
        // IOptionsSnapshot: 在scope内配置不会变,出了scope或进入新scope就会更新变化
        // IOptionsMonitor: 追踪配置变化
        private IOptionsSnapshot<Config> optConfig { get; }
    
        public TestController(IOptionsSnapshot<Config> config)
        {
            optConfig = config;
        }
    
        public void Test()
        {
            System.Console.WriteLine(optConfig.Value);
        }
    }
    

    从json文件读取

    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
    
            services.AddScoped<TestController>();
    
            ConfigurationBuilder builder = new ConfigurationBuilder();
    
            builder.AddJsonFile("config.json", true, true);
    
            IConfigurationRoot configRoot = builder.Build();
            services.AddOptions()
                .Configure<Config>(e => configRoot.Bind(e));   // 绑定Config对象
                //.Configure<Proxy>(e => configRoot.GetSection("proxy").Bind(e)); // 也可以只绑定Proxy对象
    
            using (ServiceProvider provider = services.BuildServiceProvider())
            {
                int count = 5;
    
                while (count-- > 0)
                {
                    using (IServiceScope scope = provider.CreateScope())
                    {
                        IServiceProvider sp = scope.ServiceProvider;
                        TestController test1 = sp.GetService<TestController>();
    
                        test1.Test();
                    }
    
                    System.Console.WriteLine($"press return to continue, {count} remaining...");
                    System.Console.ReadLine();
    
                    // change config value here, would reflect the changes in above Test() call.
                }
            }
        }
    }
    

    从命令行读取

    static void Main(string[] args)
    {
        ServiceCollection services = new ServiceCollection();
    
        services.AddScoped<TestController>();
    
        ConfigurationBuilder builder = new ConfigurationBuilder();
    
        builder.AddCommandLine(args);  // 加入命令行支持
        builder.AddEnvironmentVariables("prefix_");  // 加入环境变量支持,建议使用前缀,避免和其他系统冲突。
    
        IConfigurationRoot configRoot = builder.Build();
        services.AddOptions()
            .Configure<Config>(e => configRoot.Bind(e));   // bind to Config 
            //.Configure<Proxy>(e => configRoot.GetSection("proxy").Bind(e)); // bind to Proxy part only.
    
        using (ServiceProvider provider = services.BuildServiceProvider())
        {
            TestController test1 = provider.GetService<TestController>();
    
            test1.Test();
        }
    }
    
    // 命令行调用
    dotnet run --name abc --age 22 --proxy:server abc.ccc --proxy:port 888
    
    --------------------------- 知道的更多,不知道的也更多 ---------------------------
  • 相关阅读:
    【转】ListView,GridView之LayoutAnimation特殊动画的实现 ps:需要学习的是在getView中添加动画的思想
    自定义Dialog
    android 横向list特效——规格滑动
    android BaseAdapter优化
    自定义弧形进度条
    滑块闹钟界面
    HTML学习10
    HTML学习9
    HTML学习8
    HTML学习7
  • 原文地址:https://www.cnblogs.com/mryux/p/15800920.html
Copyright © 2011-2022 走看看