Получить строку подключения в приложении .NET Core

#c# #asp.net #asp.net-core #.net-core

#c# #asp.net #asp.net-core #.net-ядро

Вопрос:

Я пытаюсь получить строку подключения динамически из файла appsettings.json. Я вижу, что могу сделать это с помощью свойства Configuration класса startup. Я пометил поле конфигурации как статическое поле и получаю к нему доступ через приложение.

Мне интересно, есть ли лучший способ получить значение строки подключения из приложения .NET Core.

Комментарии:

1. Вы можете внедрить Configuration объект через службу внедрения зависимостей в ASP.NET Ядро — Пример здесь

2. Как я могу внедрить объект конфигурации в класс, который имеет только конструктор без параметров? Или даже как я могу внедрить контекст db в класс, который имеет только конструктор без параметров?

3. По крайней мере, в ASP.NET ядро рекомендуемый подход заключается в использовании шаблона options с учетом принципов SoC и ISP: learn.microsoft.com/en-us/aspnet/core/fundamentals/… Эти принципы следует учитывать и для решения .NET Core.

Ответ №1:

Вы можете проверить статью в моем блоге о ASP.NET Здесь конфигурация ядра.

В нем я также выполняю внедрение зависимостей параметров конфигурации.

Цитата:

Есть несколько способов получить настройки. Одним из способов было бы использовать объект конфигурации в Startup.cs.

Вы можете сделать конфигурацию доступной в вашем приложении глобально посредством внедрения зависимостей, выполнив это в ConfigureServices в Startup.cs:

Услуги.AddSingleton(Конфигурация);

Комментарии:

1. Как я могу внедрить объект конфигурации в класс, который имеет только конструктор без параметров? Или даже как я могу внедрить контекст db в класс, который имеет только конструктор без параметров?

2. Спасибо за совет, я также новичок в ASP.NET Основные приложения, не знал, что мы можем сделать что-то подобное. Это здорово!

3. @A.Gladkiy ASP.NET Core DI с контейнером IoC по умолчанию использует только внедрение конструктора. Вы не можете внедрить сервисы в класс другим способом. Вам следует посмотреть, задавал ли кто-нибудь еще этот вопрос раньше, и если нет, задайте новый вопрос по этому поводу.

4. Хотелось бы, чтобы ответ показал вам, как это сделать, вместо того, чтобы указывать на другие веб-сайты. Просто простой пример.

Ответ №2:

Вы можете сделать потокобезопасной Singleton вашу IConfiguration переменную, объявленную в Startup.cs файле.

 private static object syncRoot = new object();
private static IConfiguration configuration;
public static IConfiguration Configuration
{
    get
    {
        lock (syncRoot)
            return configuration;
    }
}

public Startup()
{
    configuration = new ConfigurationBuilder().Build(); // add more fields
}
  

Комментарии:

1. Я пробовал это в консольном приложении, но там нет Startup.cs, поэтому я попытался добавить его, но он не вызывает конструктор. Как вы заставили это работать?

Ответ №3:

 private readonly IHostingEnvironment _hostEnvironment;
    public IConfiguration Configuration;
    public IActionResult Index()
    {
        return View();
    }

    public ViewerController(IHostingEnvironment hostEnvironment, IConfiguration config)
    {
        _hostEnvironment = hostEnvironment;
        Configuration = config;
    }
  

и в классе, в котором вы хотите строку подключения

  var connectionString = Configuration.GetConnectionString("SQLCashConnection");