读取appsettings.json文件C#.NET Core时出现问题

时间:2018-11-25 00:50:28

标签: c# asp.net-core

我来自常规的.NET Web API,并且发现有关.NET Core 2配置的经验绝对令人发疯。

我已经阅读了官方文档和一些教程,例如this one,但是他们都看到了错误。

我有一个数据库帮助程序类,该类应该建立MongoDB连接。

我的配置非常简单

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "mongodb://localhost:27017"
  }
}
  • 我从.NET Core官方Angular(ngx)样板模板开始
  • 我在ConfigureServices部分下的Startup.CS中将配置作为服务单例添加,就像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; }

3 个答案:

答案 0 :(得分:2)

您无需在ConfigureServices部分的services.AddSingleton(Configuration);

下的Startup.CS中将配置作为服务单例添加。

如果使用类库将解决方案分为多个项目,则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"
  }
}

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

  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");
        }
    }

答案 1 :(得分:0)

使用此扩展方法GetConnectionString

尝试以下方法
public DatabaseHelper(IConfiguration Configuration)
{
    connstring = Configuration.GetConnectionString("DefaultConnection");
}

答案 2 :(得分:0)

尝试

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

}

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