Как получить строку подключения в стандартной библиотеке классов .net core из файла конфигурации в веб-приложении .net core 2.0? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть стандартная базовая библиотека классов .net, которая по сути является DAL с несколькими методами классов, которые возвращают коллекции и объекты из базы данных. Строка подключения находится в файле appsettings.json основного веб-приложения ASP.net 2. Я также хочу получить доступ к этой библиотеке классов из проекта консольного приложения, где файл конфигурации со строкой соединения будет присутствовать в этом проекте консольного приложения.

Это было просто в .net до ядра .net. Библиотека классов DAL будет просто обращаться к web.config из веб-проекта и app.config из консольного приложения, так как на эту библиотеку ссылаются как в веб-приложении, так и в консольных приложениях. Но не похоже, что это вообще возможно.

Я ищу простое решение в ядре .net для получения строки подключения из веб-приложения или консольного приложения в зависимости от обстоятельств.

Ответы [ 2 ]

1 голос
/ 06 июля 2019

Можно очень легко получить доступ к "строкам подключения" или другим данным конфигурации в ядре .Net без особых дополнительных усилий.

Просто то, что система конфигурации эволюционировала (во что-то гораздо лучшее), и мы имеемчтобы сделать это также (и следуйте рекомендуемым методам).

В вашем случае, когда вы получаете доступ к значению строки подключения в стандартной библиотеке (предназначенной для повторного использования), вы не должны делать предположения о том, какЗначения конфигурации будут «поданы» вашему классу.Это означает, что вы не должны писать код для чтения строки подключения непосредственно из файла конфигурации - вместо этого полагайтесь на механизм внедрения зависимостей, чтобы предоставить вам необходимую конфигурацию - независимо от того, как она была сделана доступной для вашего приложения.

Один из способов сделать это - «потребовать» вставки объекта IConfiguration в конструктор вашего класса, а затем использовать метод GetValue для получения значения для соответствующего ключа, например:

public class IndexModel : PageModel
{
    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    public int NumberConfig { get; private set; }

    public void OnGet()
    {
        NumberConfig = _config.GetValue<int>("NumberKey", 99);
    }
}

В ядре .net перед настройкой и запуском приложения настраивается и запускается «хост».Хост отвечает за запуск приложения и управление временем жизни.И приложение, и хост настраиваются с использованием различных «провайдеров конфигурации».Пары ключ-значение конфигурации хоста становятся частью глобальной конфигурации приложения.

Источники конфигурации считываются в том порядке, в котором их поставщики конфигурации указаны при запуске.

.Net core поддерживает различных «провайдеров». Прочтите эту статью для полной информации по этой теме .

1 голос
/ 06 июля 2019

Вероятно, вы ошибаетесь, когда хотите получить доступ к конфигурации из вашей библиотеки классов, но затем вы хотите сообщить подробности о вызывающем абоненте (он будет иметь файл web.config).

Но что если вы решите в своем веб-приложении использовать хранилище ключей Azure или другой механизм секретов? Ваша библиотека классов должна затем изменить всю свою реализацию, чтобы использовать Key Vault? И значит ли это, что ваше консольное приложение также не имеет опции , но также использует Key Vault?

Таким образом, решение заключается в использовании инверсии зависимостей. Проще говоря, допустим, у меня есть код, подобный следующему:

interface IMyRepositoryConfiguration
{
    string ConnectionString {get;}
}

class MyRepositoryConfiguration : IMyRepositoryConfiguration
{
    public string ConnectionString {get;set;}
}

class MyRepository
{
    private readonly IMyRepositoryConfiguration _myRepositoryConfiguration;

    public MyRepository(IMyRepositoryConfiguration myRepositoryConfiguration)
    {
        _myRepositoryConfiguration = myRepositoryConfiguration;
    }
}

Теперь в моем файле startup.cs я могу сделать что-то вроде:

services.AddSingleton<IMyRepositoryConfiguration>(new MyRepositoryConfiguration {//Set connection string from app settings etc});

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

В качестве альтернативы вы также можете использовать класс Options, но лично я предпочитаю POCO. Более подробная информация здесь: https://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...