【问题标题】:Issues reading appsettings.json file C# .NET Core读取 appsettings.json 文件 C# .NET Core 的问题
【发布时间】:2018-11-26 21:18:43
【问题描述】:

我来自常规的 .NET Web API,我发现 .NET Core 2 中的配置体验绝对令人抓狂。

官方文档和this one等一些教程我都看了,都看错了。

我有一个用于建立 MongoDB 连接的数据库助手类。

我的配置比较简单

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "mongodb://localhost:27017"
  }
}
  • 我从 .NET Core 官方 Angular (ngx) 样板模板开始
  • 我将配置添加为 Startup.CS 中 ConfigureServices 部分下的服务单例,就像 services.AddSingleton(Configuration);
  • 我尝试像这样将配置注入我的班级

    public class DatabaseHelper
    {
        public static string connstring { get; private set; }
        public DatabaseHelper(IConfiguration Configuration)
        {
            connstring = Configuration["ConnectionStrings:DefaultConnectionString"];
        }
    
    
        public static IMongoDatabase QuizDB { get; } = GetDatabase("QuizEngine");
        public static IMongoCollection<Quiz> QuizCol { get; } = GetQuizCollection();
    
    
        public static MongoClient GetConnection() {
    
            return new MongoClient(connstring);
        }
    
        public static IMongoDatabase GetDatabase(string database) {
    
            MongoClient conn = DatabaseHelper.GetConnection();
            return conn.GetDatabase(database);
        }
    
        public static IMongoCollection<Quiz> GetQuizCollection() {
            return DatabaseHelper.QuizDB.GetCollection<Quiz>("Quizzes");            
        }
    }
    

这编译和构建没有 Intellesense 错误 - 但是当我在调试器中单步执行它时,connstring 为空。我尝试过使用配置名称等,但我似乎总是空着。

我也尝试过使用以下答案中的示例代码的 POCO 方式,但我似乎遇到了静态字段初始化程序问题。

Getting value from appsettings.json in .net core

如果它在这里有帮助的话是启动类部分,它设置Configuration的公共值

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

    public IConfiguration Configuration { get; }

【问题讨论】:

  • 你的名字不匹配是错字吗? DefaultConnectionDefaultConnectionString
  • 克里斯所说的。另外,您不应该将IConfiguration 注入您的课程。使用选项模式或直接注入MongoClient(并通过工厂方法注册,如services.AddScoped&lt;IMongoClient&gt;(provider =&gt; new MongoClient(Configuration.GetConnectionString("DefaultConnection")));
  • 您可以在此处阅读有关选项模式的更多信息:Options pattern in ASP.NET Core。附言它说 ASP.NET Core 中的选项模式,但它也可以应用于控制台应用程序
  • @Chris 你是对的,我有一个错字 - 但是我尝试将其更改为更简单的内容 (dburi),但它仍然显示为 null。
  • 啊,刚刚注意到除了构造函数之外的一切都是静态的。您是否在 DI 容器实例化的对象实例上调用这些方法?

标签: c# asp.net-core


【解决方案1】:

您不需要像services.AddSingleton(Configuration); 那样在Startup.CS 中的ConfigureServices 部分下将配置添加为服务单例

如果您使用类库将您的解决方案分成多个项目,Microsoft.Extensions.Options.ConfigurationExtensions 包可以方便地从appsettings 文件中读取值并将它们注入到项目中的配置类中。

它有 2 个可以使用的扩展:

public static T Get<T>(this IConfiguration configuration);
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, 
    IConfiguration config) where TOptions : class;

你的配置文件appsetting.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MongoDBConnection": "mongodb://localhost:27017"
  }
}

startup.cs 文件中添加ConfigureServices 方法的代码

  services.Configure<MongoDBconfig>(Configuration.GetSection("ConnectionStrings"));
  services.AddSingleton<DatabaseHelper>();

你的DBhelper.cs

    public class MongoDBconfig
    {
        public string MongoDBConnection { get; set; }
    }

    public class DatabaseHelper
    {
        public static string connstring { get; private set; }
        public DatabaseHelper(IOptions<MongoDBconfig> Configuration)
        {
            connstring = Configuration.Value.MongoDBConnection;
        }


        public static IMongoDatabase QuizDB { get; } = GetDatabase("QuizEngine");
        public static IMongoCollection<Quiz> QuizCol { get; } = GetQuizCollection();


        public static MongoClient GetConnection()
        {

            return new MongoClient(connstring);
        }

        public static IMongoDatabase GetDatabase(string database)
        {

            MongoClient conn = DatabaseHelper.GetConnection();
            return conn.GetDatabase(database);
        }

        public static IMongoCollection<Quiz> GetQuizCollection()
        {
            return DatabaseHelper.QuizDB.GetCollection<Quiz>("Quizzes");
        }
    }

【讨论】:

  • 谢谢 - 我会检查一下。
【解决方案2】:

使用此扩展方法GetConnectionString尝试以下方式

public DatabaseHelper(IConfiguration Configuration)
{
    connstring = Configuration.GetConnectionString("DefaultConnection");
}

【讨论】:

  • 返回为 null :(
【解决方案3】:

试试这个

public DatabaseHelper(IConfiguration Configuration)
{
   string test = Configuration.GetSection("ConnectionStrings")["DefaultConnection"];
   Console.WriteLine(test);

}

检查这是否能够提取 appsettings.json 中的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多