c# - 无法读取 .NET Core API 项目中的应用设置
问题描述
我有一个 .NET Core API 项目,我正在尝试从appsettings.json文件中读取一些设置。
该文件如下所示:
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
"ConnectionString": "abc"
}
我正在尝试阅读这样的ConnectionString
设置:
ConfigurationManager.AppSettings["ConnectionString"];
但我得到null
了,显然根本没有检测到应用程序设置。
编辑:
这是我现在拥有的:
启动.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public static IConfiguration Configuration { get; set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyContext>();
services.AddMvc();
services.Configure<ConnectionStringSettings>(Configuration);
}
}
连接字符串设置.cs
public class ConnectionStringSettings
{
public string ConnectionString { get; set; }
}
应用设置.json
{
"Logging": {
...
},
"ConnectionStrings": {
"Debug": "abc"
}
}
MyContext.cs 公共类 MyContext : DbContext { string 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);
}
}
解决方案
对于 .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}"
}
如果需要,这将允许多个字符串,但即使您只有一个也可以工作。
编辑:一旦你得到了字符串,正如 ColinM 在他的回答中所说,你需要将字符串注册到一个可以注入到你的类中的类中。在启动时如下。
services.AddSingleton<IConnectionStringFactory, ConnectionStringFactory>(serviceProvider => new ConnectionStringFactory(Configuration.GetConnectionString("System")));
您的连接字符串类...
public class ConnectionStringFactory : IConnectionStringFactory
{
private readonly string _connectionString;
public ConnectionStringFactory(string connectionString)
{
_connectionString = connectionString;
}
public string Invoke()
{
return _connectionString;
}
}
像这样注入你的班级......
public class ClassName
{
private readonly IConnectionStringFactory _connectionStringFactory;
public ClassName(IConnectionStringFactory connectionStringFactory)
{
_connectionStringFactory = connectionStringFactory;
}
...
}
您的界面可以像下面这样简单
public interface IConnectionStringFactory
{
}
您不需要使用界面,但我推荐这种方法
推荐阅读
- sapui5 - SAPUI5中匹配无效哈希时如何显示NotFound
- html - 如何使网站垂直响应?
- c# - Tcp Listener 和 Client 只接收和发送一次
- c - 在c中比较两个具有相同名称的不同字符串
- clojure - 在 Clojure 中,可以在使用顺序解构时提供默认值吗?
- scala - 找不到符号符号:变量参数位置:com.twitter.finagle.transport.Transport.Liveness 类
- r - 将数据从本地目录移动到 AWS
- sql - SQL - 具有相同 ID 和日期的组数据,这些数据已经到每台机器但具有不同的名称
- r - 在 Shiny 应用程序中显示进度条
- matlab - 卷积层如何连接到 MATLAB 中的全连接层?