Как использовать System.Configuration.ConfigurationManager в библиотеке .netstanard для .net core и .netframework

Я переношу библиотеку классов .netframework 4.7.2 в библиотеку .netstandard 2.0.

ConfigurationManager используется в библиотеке классов .netframework для чтения параметров приложения.

Любой альтернативный вариант, доступный для System.Configuration.ConfigurationManager в .netstanard.

Перенесенную библиотеку классов необходимо использовать в основном веб-API .net и старом веб-приложении .netframework.


person Manu    schedule 30.04.2020    source источник
comment
Если вы делаете библиотеку, старайтесь вообще избегать доступа к файлу конфигурации. Вместо этого ваши библиотечные классы должны иметь конфигурацию, которую им необходимо передать хост-приложению. Это обеспечивает гибкость вашей библиотеки и не привязывает вас к какой-либо конкретной реализации. Это может потребовать небольшого рефакторинга, но не должно быть слишком ужасным.   -  person mason    schedule 30.04.2020
comment
@mason У вас есть пример или ссылка на пример?   -  person Manu    schedule 01.05.2020
comment
вы также можете привязать свою конфигурацию к классу POCO и вместо этого передать ее, чтобы у вас не было зависимости конфигурации везде   -  person sommmen    schedule 01.05.2020


Ответы (2)


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

Не делайте этого в своей библиотеке классов:

public void UpdateProductName(int productId, string name)
{
    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDatabase"]))
    {
        connection.ExecuteNonQuery("UPDATE dbo.Products SET Name = @Name WHERE Id = @ProductId", new {  ProductId = productId, Name = name });
    }
}

Непосредственно используя ConfigurationManager в своей библиотеке классов, вы привязываете класс к разрешению только одной формы получения строки подключения. Это означает, что если вы хотите использовать appsettings.json, переменные среды, KeyVault или любой другой метод получения конфигурации, вы не можете этого сделать.

Вместо этого сделайте следующее:

public class MyDatabaseRepository
{
    readonly string _connectionString;

    public MyDatabaseRepository(string connectionString)
    {
        _connectionString = connectionString;
    }
} 

public void UpdateProductName(int productId, string name)
{
    using (var connection = new SqlConnection(_connectionString))
    {
        connection.ExecuteNonQuery("UPDATE dbo.Products SET Name = @Name WHERE Id = @ProductId", new {  ProductId = productId, Name = name });
    }
}

Теперь это позволяет вам получить строку подключения, как вы хотите, в приложении-потребителе.

В приложении .NET Core вы можете сделать это, чтобы получить строку подключения из appsettings.json через Microsoft.Extensions.Configuration:

string connectionString = Configuration.GetConnectionString("MyDatabase");
MyDatabaseRepository repository = new MyDatabaseRepository(connectionString);
repository.UpdateProductName(1, "Transformer");

И это по-прежнему позволяет вам гибко использовать System.Configuration в вашем приложении .NET Framework:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
MyDatabaseRepository repository = new MyDatabaseRepository(connectionString);
repository.UpdateProductName(1, "Transformer");

В сочетании с внедрением зависимостей это становится очень гибким и мощным инструмент.

person mason    schedule 01.05.2020

Вы можете установить ConfigurationManager через пакет nuget, предназначенный для .Net Standard 2.0.

Что касается ASP.Net Core, посмотрите Microsoft.Extensions.Configuration.

person weichch    schedule 01.05.2020