首页 > 解决方案 > 无法读取 .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);
    }

}

标签: c#.net-coreasp.net-core-webapiconfigurationmanager

解决方案


对于 .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
{
}

您不需要使用界面,但我推荐这种方法


推荐阅读