Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用.NET Core从控制台应用程序中的appsettings.json获取值?_C#_.net Core_Startup_Appsettings - Fatal编程技术网

C# 如何使用.NET Core从控制台应用程序中的appsettings.json获取值?

C# 如何使用.NET Core从控制台应用程序中的appsettings.json获取值?,c#,.net-core,startup,appsettings,C#,.net Core,Startup,Appsettings,我正在使用.NETCore3.1创建一个控制台应用程序,我希望有一个appsettings json来加载所有 环境、路径、变量,。。。然后从其他库类获取值。 我用appsettings json中包含的数据创建了一个“Settings”类。 这是我在教程中看到的,但我无法得到任何价值 //Start.cs public class Startup { public Startup(IHostingEnvironment env) { va

我正在使用.NETCore3.1创建一个控制台应用程序,我希望有一个appsettings json来加载所有 环境、路径、变量,。。。然后从其他库类获取值。 我用appsettings json中包含的数据创建了一个“Settings”类。 这是我在教程中看到的,但我无法得到任何价值

//Start.cs
public class Startup
{
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();

            Configuration = builder.Build();
        }

        public IConfiguration Configuration { get; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
}

//Settings.cs
 public class Settings
    {
        public ConnectionStrings ConnectionStrings { get; set; }
        public Logging Logging { get; set; }
        public AppSettings AppSettings { get; set; }
    ...

//A class to use it in other lib
 public class Extractor
    {
        private readonly IConfiguration _configuration;

        public Extractor(IConfiguration configuration) : this()
        {
            _configuration = configuration;
            Init();
        }

        public void Init()
        {
            // Extractor:Min is a variable included in appsettings.json
            Min = _configuration.GetValue<int>("Extractor:Min")
                                  
        }
//Start.cs
公营创业
{
公共启动(IHostingEnvironment环境)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddenEnvironmentVariables();
Configuration=builder.Build();
}
公共IConfiguration配置{get;}
公共启动(IConfiguration配置)
{
配置=配置;
}
}
//设置.cs
公共类设置
{
公共连接字符串连接字符串{get;set;}
公共日志记录{get;set;}
公共AppSettings AppSettings{get;set;}
...
//在其他库中使用它的类
公共类提取器
{
专用只读IConfiguration\u配置;
公共提取器(IConfiguration配置):this()
{
_配置=配置;
Init();
}
公共void Init()
{
//提取器:Min是appsettings.json中包含的一个变量
Min=\u configuration.GetValue(“提取器:Min”)
}
因为我不知道如何初始化所有东西,所以我无法创建一个正确的主管道…我缺少什么?我想我一直在为这么简单的事情兜圈子。提前谢谢!
注意:我需要从另一个库类中获取这些变量,而不是从Main中获取。我不知道如何在其他类中初始化“配置”以使用它。感谢您的示例混合了一些ASP NET核心方法,这些方法希望托管您的代码。要最低限度地解决从JSON配置中获取选项或设置的问题n,考虑以下内容:

一个
config.json
文件,设置为“复制到输出目录”,以便包含在生成中:

{
  "MyFirstClass": {
    "Option1": "some string value",
    "Option2": 42
  },
  "MySecondClass": {
    "SettingOne": "some string value",
    "SettingTwo": 42
  }
}
以下方法将从JSON文件加载内容,然后将内容绑定到两个强类型的选项/设置类,这比按值执行要干净得多:

using System;
using System.IO;
using Microsoft.Extensions.Configuration;

// NuGet packages:
// Microsoft.Extensions.Configuration.Binder
// Microsoft.Extensions.Configuration.Json

namespace SampleConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("config.json", optional: false);

            IConfiguration config = builder.Build();

            var myFirstClass = config.GetSection("MyFirstClass").Get<MyFirstClass>();
            var mySecondClass = config.GetSection("MySecondClass").Get<MySecondClass>();
            Console.WriteLine($"The answer is always {myFirstClass.Option2}");
        }
    }

    public class MyFirstClass
    {
        public string Option1 { get; set; }
        public int Option2 { get; set; }
    }

    public class MySecondClass
    {
        public string SettingOne { get; set; }
        public int SettingTwo { get; set; }
    }
}
使用系统;
使用System.IO;
使用Microsoft.Extensions.Configuration;
//NuGet软件包:
//Microsoft.Extensions.Configuration.Binder
//Microsoft.Extensions.Configuration.Json
命名空间示例控制台
{
班级计划
{
静态void Main(字符串[]参数)
{
var builder=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“config.json”,可选:false);
IConfiguration config=builder.Build();
var myFirstClass=config.GetSection(“myFirstClass”).Get();
var mySecondClass=config.GetSection(“mySecondClass”).Get();
WriteLine($“答案总是{myFirstClass.Option2}”);
}
}
公务舱我的头等舱
{
公共字符串选项1{get;set;}
公共int选项2{get;set;}
}
公共类MySecondClass
{
公共字符串设置一{get;set;}
public int SettingTwo{get;set;}
}
}

我对.NET Core也有同样的问题,我发现这个解决方案运行良好:

  • 我有一个appsettings.json
  • 我创建了一个类appsetingshandler.cs
  • 公共类appsetingshandler
    {
    私有字符串\u文件名;
    私有应用程序设置_config;
    公共appsetingshandler(字符串文件名)
    {
    _filename=文件名;
    _config=GetAppSettings();
    }
    公共AppSettings GetAppSettings()
    {
    var config=new ConfigurationBuilder()
    .SetBasePath(AppContext.BaseDirectory)
    .AddJsonFile(_文件名,false,true)
    .Build();
    返回config.GetSection(“App”).Get();
    }
    }
    
  • 然后,您需要一个AppSettings的“model”类:
  • 每个包含的子类都有一个模型类,我在此仅举一个例子:

        public class LoginCredentialsConfiguration
        {
            public string ClientId { get; set; }
            public string ClientSecret { get; set; }
            public string TenantId { get; set; }
        }
    
  • 在Program.cs类中,您现在可以从appsettings.json获取如下参数:

  • 当然,您可以调整代码,使其符合您的需求,也就是说,您必须定义自己的类和子类,当然您还可以通过获取appsettings.json的其他部分来扩展AppSettingsHandler.cs。

    这是否回答了您的问题?感谢您的回答!问题是我需要获取这些变量我不知道如何在其他类中初始化“配置”以使用它。Thanks@JaviL您可以将这些设置/选项类或IConfiguration对象本身放入静态全局实例中,也可以使用依赖项注入和IoC容器进行研究(ASP NET Core可选择一个或另一个)将这些选项正确地注入到任何其他类希望使用它们的内容中。较旧的文章,但与第二个问题相关:感谢您的回答!问题是我需要在另一个库类中获取这些变量,而不是在Main中。我不知道如何在其他类中初始化“配置”以使用它。比ks
    SetBasePath()
    不再存在于.net core 5中。有什么替代方案?
        public class AppSettings
        {
            public LoginCredentialsConfiguration LoginCredentials { get; set; }
            public DatabaseConfiguration DataBase { get; set; }
            public GeneralConfiguration General { get; set; }
        }
    
        public class LoginCredentialsConfiguration
        {
            public string ClientId { get; set; }
            public string ClientSecret { get; set; }
            public string TenantId { get; set; }
        }
    
                var aH = new AppSettingsHandler("appsettings.json");
                var aS = aH.GetAppSettings();
                var myPath = aS.DataBase.PathToDatabases;