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