C# Can';无法读取.NET核心API项目中的应用程序设置

C# Can';无法读取.NET核心API项目中的应用程序设置,c#,.net-core,asp.net-core-webapi,configurationmanager,C#,.net Core,Asp.net Core Webapi,Configurationmanager,我有一个.NET核心API项目,我正在尝试从appsettings.json文件中读取一些设置 该文件如下所示: { "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning"

我有一个.NET核心API项目,我正在尝试从appsettings.json文件中读取一些设置

该文件如下所示:

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },
  "ConnectionString": "abc"
}
ConfigurationManager.AppSettings["ConnectionString"];
我正在尝试这样读取
ConnectionString
设置:

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },
  "ConnectionString": "abc"
}
ConfigurationManager.AppSettings["ConnectionString"];
但是我得到了
null
,显然根本没有检测到任何应用程序设置

编辑:

以下是我现在拥有的:

startup.cs

appsettings.json

MyContext.cs 公共类MyContext:DbContext { 字符串x

    public MyContext() { }

    public MyContext(DbContextOptions<MyContext> options)
        : base(options) { }

    public MyContext(IOptions<ConnectionStringSettings> connectionStringSettings)
    {
        x = connectionStringSettings.Value.ConnectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
       //here I need my connection string
        optionsBuilder.UseMySql(connectionString);
    }
public MyContext(){}
公共MyContext(DbContextOptions)
:base(选项){}
公共MyContext(IOOptions ConnectionString设置)
{
x=ConnectionString设置.Value.ConnectionString;
}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
//这里我需要我的连接字符串
optionsBuilder.UseMySql(connectionString);
}

}

对于.NET Core 2.x,您需要在启动时设置配置,如下所示

 public partial class Startup
    {
        public static IConfiguration Configuration;

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    ...
}
然后按如下方式访问

Configuration.GetConnectionString("System")
您还应该将连接字符串按如下方式布置

"ConnectionStrings": {
    "System": "{connection String}"
  }
services.AddSingleton<IConnectionStringFactory, ConnectionStringFactory>(serviceProvider => new ConnectionStringFactory(Configuration.GetConnectionString("System")));
如果需要,这将允许使用多个字符串,但即使只有一个字符串也可以使用

编辑:一旦你得到了字符串,正如ColinM在他的回答中所说,你需要将字符串注册到一个类中,你可以将它注入到你的类中。在启动中,如下所示

"ConnectionStrings": {
    "System": "{connection String}"
  }
services.AddSingleton<IConnectionStringFactory, ConnectionStringFactory>(serviceProvider => new ConnectionStringFactory(Configuration.GetConnectionString("System")));
注入到你的课堂,这样

public class ClassName
{
    private readonly IConnectionStringFactory _connectionStringFactory;

public ClassName(IConnectionStringFactory connectionStringFactory)
    {
        _connectionStringFactory = connectionStringFactory;
    }

...
}
您的界面可以像下面这样简单

public interface IConnectionStringFactory
{
}

您不需要使用接口,但我建议您使用这种方法。

对于.NET Core 2.x,您需要在启动时设置配置,如下所示

 public partial class Startup
    {
        public static IConfiguration Configuration;

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    ...
}
然后按如下方式访问

Configuration.GetConnectionString("System")
您还应该将连接字符串按如下方式布置

"ConnectionStrings": {
    "System": "{connection String}"
  }
services.AddSingleton<IConnectionStringFactory, ConnectionStringFactory>(serviceProvider => new ConnectionStringFactory(Configuration.GetConnectionString("System")));
如果需要,这将允许使用多个字符串,但即使只有一个字符串也可以使用

编辑:一旦你得到了字符串,正如ColinM在他的回答中所说,你需要将字符串注册到一个类中,你可以将它注入到你的类中。在启动中,如下所示

"ConnectionStrings": {
    "System": "{connection String}"
  }
services.AddSingleton<IConnectionStringFactory, ConnectionStringFactory>(serviceProvider => new ConnectionStringFactory(Configuration.GetConnectionString("System")));
注入到你的课堂,这样

public class ClassName
{
    private readonly IConnectionStringFactory _connectionStringFactory;

public ClassName(IConnectionStringFactory connectionStringFactory)
    {
        _connectionStringFactory = connectionStringFactory;
    }

...
}
您的界面可以像下面这样简单

public interface IConnectionStringFactory
{
}

您不需要使用接口,但我建议使用这种方法

您应该在启动时使用配置=>

    public void ConfigureServices(IServiceCollection services)
    {
       var section = Configuration.GetSection("ConnectionString");
       var value= Configuration.GetValue<string>("ConnectionString")
    }
public void配置服务(IServiceCollection服务)
{
var section=Configuration.GetSection(“ConnectionString”);
var value=Configuration.GetValue(“ConnectionString”)
}

您应该在启动时使用配置=>

    public void ConfigureServices(IServiceCollection services)
    {
       var section = Configuration.GetSection("ConnectionString");
       var value= Configuration.GetValue<string>("ConnectionString")
    }
public void配置服务(IServiceCollection服务)
{
var section=Configuration.GetSection(“ConnectionString”);
var value=Configuration.GetValue(“ConnectionString”)
}

根据您在上下文中配置覆盖中设置连接字符串的要求,您可以使用以下方法

更新appsettings.json配置文件以包含数据库选项的新json对象

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "DatabaseOptions": {
        "ConnectionString": "<Connection String>"
    }
}
然后更新您的
Startup
class'
ConfigureServices
方法以注册
IOptions

public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.Configure(Configuration.GetSection(“DatabaseOptions”);
}
最后,更新上下文构造函数以注入
IOptions
实例,只要您在服务集合中注册上下文,ASP.NET Core就会为您处理依赖项注入

public class MyContext
{
    private readonly DatabaseOptions databaseOptions;

    public MyContext(DbContextOptions<MyContext> options, IOptions<DatabaseOptions> databaseOptions)
        : base(options)
    {
        this.databaseOptions = databaseOptions.Value;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        //here I need my connection string
        optionsBuilder.UseMySql(databaseOptions.ConnectionString);
    }
}
公共类MyContext
{
专用只读数据库选项DatabaseOptions;
公共MyContext(DbContextOptions选项、IOOptions数据库选项)
:基本(选项)
{
this.databaseOptions=databaseOptions.Value;
}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
//这里我需要我的连接字符串
optionsBuilder.UseMySql(databaseOptions.ConnectionString);
}
}

就我个人而言,当类将与
IOptions
一起使用时,我不喜欢用名称中的选项命名类,但是作为开发人员,我们可以花大量时间编写代码,只考虑类和变量名,请随意重命名。

根据您在上下文中配置覆盖中设置连接字符串的要求,您可以使用以下方法

更新appsettings.json配置文件以包含数据库选项的新json对象

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "DatabaseOptions": {
        "ConnectionString": "<Connection String>"
    }
}
然后更新您的
Startup
class'
ConfigureServices
方法以注册
IOptions

public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.Configure(Configuration.GetSection(“DatabaseOptions”);
}
最后,更新上下文构造函数以注入
IOptions
实例,只要您在服务集合中注册上下文,ASP.NET Core就会为您处理依赖项注入

public class MyContext
{
    private readonly DatabaseOptions databaseOptions;

    public MyContext(DbContextOptions<MyContext> options, IOptions<DatabaseOptions> databaseOptions)
        : base(options)
    {
        this.databaseOptions = databaseOptions.Value;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        //here I need my connection string
        optionsBuilder.UseMySql(databaseOptions.ConnectionString);
    }
}
公共类MyContext
{
专用只读数据库选项DatabaseOptions;
公共MyContext(DbContextOptions选项、IOOptions数据库选项)
:基本(选项)
{
this.databaseOptions=databaseOptions.Value;
}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
//这里我需要我的连接字符串
optionsBuilder.UseMySql(databaseOptions.ConnectionString);
}
}

就个人而言,当类将与
IOptions
一起使用时,我不喜欢用名称中的选项命名类,但作为开发人员,我们可以花大量时间编码,只考虑类和变量名,请随意重命名。

如果我没有弄错的话,
ConfigurationManager
用于App.config文件,而不是新的appsettings.json文件。您需要使用
ConfigurationBuilder
clas