.NET Core configuration file loading and DI injection of configuration data

高洛峰
Release: 2017-05-26 13:33:00
Original
2895 people have browsed it

.NET Core configuration file

In the past, configuration files in .NET were all in XML format such as App.config/Web.config. However, in .NET Core, it is recommended to use configuration files in JSON format because it is easier to use It is more flexible and can use DI in .NET Core to inject configuration data.

Use:

var config = new ConfigurationBuilder()
                .AddInMemoryCollection()    //将配置文件的数据加载到内存中
                .SetBasePath(Directory.GetCurrentDirectory())   //指定配置文件所在的目录
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)  //指定加载的配置文件
                .Build();    //编译成对象  
            Console.WriteLine(config["test"]);  //获取配置中的数据
            config["test"] = "test test";   //修改配置对象的数据,配置对象的数据是可以被修改的
            Console.WriteLine(config["test11"]);    //获取配置文件中不存在数据也是不会报错的
            Console.WriteLine(config["theKey:nextKey"]);    //获取:theKey -> nextKey 的值
Copy after login

Configuration file appsettings.json file content:

{
  "test": "testVal",
  "theKey": {
    "nextKey": "keyVal"
  }
}
Copy after login

Note:

ConfigurationBuilder needs to add the package: "Microsoft.Extensions.Configuration"

AddJsonFile needs to add the package: "Microsoft.Extensions.Configuration.Json"

Use with DI

var sp = new ServiceCollection()
                .AddOptions()   //注入IOptions<T>,这样就可以在DI容器中获取IOptions<T>了
                .Configure<TestCls>(config.GetSection("TestCls"))   //注入配置数据
                //也可以对注入的配置数据进行修改
                .Configure<TestCls>(t =>
                {
                    t.Name = "Jame"; //修改Name的值
                })
                .BuildServiceProvider();    //编译

            var test = sp.GetService<IOptions<TestCls>>();    //获取注入的配置数据对象
            Console.WriteLine(JsonConvert.SerializeObject(test.Value));    //{"Name":"Jame","Age":123}

            //下面的代码中检验Configure注入的配置数据对象是单例模式的(.NET Core中DI容器的三种生命周期:Singleton(单例), Scoped(作用域), Transient(瞬态))
            var test1 = sp.GetService<IOptions<TestCls>>();
            Console.WriteLine(test == test1);   //true
            //创建一个新的作用域获取配置数据对象
            var test2 = sp.GetService<IServiceScopeFactory>().CreateScope().ServiceProvider.GetService<IOptions<TestCls>>();
            Console.WriteLine(test == test2);   //true
Copy after login

Configuration test class:

         public class TestCls
         {
             public string Name { get; set; }
             public int Age { get; set; }
         }
Copy after login

Contents in appsettings.json:

{
  "TestCls": {
    "Name": "Tom",
    "Age": 123
  }
}
Copy after login

Note:

ServiceCollection needs to add the package: "Microsoft.Extensions.DependencyInjection"

AddOptions needs to add the package : "Microsoft.Extensions.Options.ConfigurationExtensions"

ASP.NET Core is used in

Startup.cs -> Initialization configuration file in the Startup construction method:

var builder = new ConfigurationBuilder()
                .AddInMemoryCollection()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
            Configuration = builder.Build();
Copy after login

Startup.cs -> ConfigureServices method Inject configuration data:

services.AddOptions()        //注入IOptions<T>
                .Configure<TestCls>(Configuration.GetSection(nameof(TestCls)))
                .Configure<TestCls>(test =>
                {
                    test.Name = "Jame"; //修改Name的值
                });
Copy after login

Configuration data in the configuration file:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "TestCls": {
    "Name": "Tom",
    "Age": 123
  }
}
Copy after login

Inject into the controller:

[Route("api/[controller]")]
    public class ValuesController : Controller
    {
        IOptions<TestCls> _test;
        public ValuesController(IOptions<TestCls> test)
        {
            _test = test;
        }
        [HttpGet]
        public string Gets()
        {
            return JsonConvert.SerializeObject(_test.Value);
        }
Copy after login

Access: /api/values

Display: {"Name":"Jame","Age":123 }

【Related recommendations】

1. Graphic verification code for .Net Core

2. .NET Core CLI tool documentation dotnet-publish

3. Detailed introduction to ZKEACMS for .Net Core

4. Share the example code of using forms verification in .net MVC

5. How to make http request under .net core?

6. An example tutorial of running ZKEACMS on CentOS

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template