Home  >  Article  >  Backend Development  >  .NET Core configuration file loading and DI injection of configuration data

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

高洛峰
高洛峰Original
2017-05-26 13:33:002894browse

.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 的值

Configuration file appsettings.json file content:

{
  "test": "testVal",
  "theKey": {
    "nextKey": "keyVal"
  }
}

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

Configuration test class:

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

Contents in appsettings.json:

{
  "TestCls": {
    "Name": "Tom",
    "Age": 123
  }
}

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();

Startup.cs -> ConfigureServices method Inject configuration data:

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

Configuration data in the configuration file:

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

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);
        }

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

Statement:
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