Проблемы чтения файла appsettings.json C # .NET Core - PullRequest
0 голосов
/ 25 ноября 2018

Я прихожу из обычного .NET Web API и обнаружил, что опыт настройки в .NET Core 2 абсолютно сводит с ума.

Я прочитал официальную документацию и несколько учебных пособий, таких как этот , но все они видят ошибку.

У меня есть вспомогательный класс базы данных, который должен устанавливать соединение 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, используя пример кода в ответе ниже, но, похоже, я сталкиваюсь со статическим полем.проблемы инициализатора.

Получение значения из appsettings.json в ядре .net

, если это помогает, это часть класса запуска, где он устанавливает общедоступное значение Configuration

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

    public IConfiguration Configuration { get; }

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Вам не нужно добавлять конфигурацию как единый сервис в Startup.CS в разделе ConfigureServices, например services.AddSingleton(Configuration);

Если вы разделяете свое решение на несколько проектов с использованием библиотек классов,Пакет 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");
        }
    }
0 голосов
/ 26 ноября 2018

Попробуйте это

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

}

Проверьте, может ли это извлечь значение из вашего appsettings.json

0 голосов
/ 25 ноября 2018

Попробуйте следующий способ, используя этот метод расширения GetConnectionString

public DatabaseHelper(IConfiguration Configuration)
{
    connstring = Configuration.GetConnectionString("DefaultConnection");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...