Библиотеки классов IMO должны быть агностическими для данных параметров приложения. Как правило, потребитель библиотеки - тот, кто связан с такими деталями. Да, это не всегда так (например, если у вас есть класс, который шифрует/расшифровывает RSA, вы можете захотеть, чтобы какая-то частная конфигурация разрешала генерацию/хранение личного ключа), но по большей части это правда.
В общем, попробуйте сохранить настройки приложения из библиотеки классов и предоставить пользователям такие данные. В своем комментарии вы указываете строку подключения к базе данных. Это прекрасный пример данных, которые должны храниться вне библиотеки классов. Библиотеке не должно заботиться о том, к какой базе данных она звонит, чтобы читать, просто чтобы ее нужно было читать.Пример ниже (я извиняюсь, если есть какие-то ошибки, как я пишу это на лету из памяти):
Библиотека
класс библиотеки, которая использует строку подключения
public class LibraryClassThatNeedsConnectionString
{
private string connectionString;
public LibraryClassThatNeedsConnectionString(string connectionString)
{
this.connectionString = connectionString;
}
public string ReadTheDatabase(int somePrimaryKeyIdToRead)
{
var result = string.Empty;
// Read your database and set result
return result;
}
}
Применение
appsettings.json
{
"DatabaseSettings": {
"ConnectionString": "MySuperCoolConnectionStringWouldGoHere"
}
}
DatabaseSettings.cs
public class DatabaseSettings
{
public string ConnectionString { get; set; }
}
Startup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
Configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.Build();
}
public IConfigurationRoot Configuration { get; }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// Setup logging
// Configure app
}
public void ConfigureServices(IServiceCollection services)
{
// Configure services
services.Configure<DatabaseSettings>(Configuration.GetSection("DatabaseSettings"));
services.AddOptions();
}
}
Класс, который использует класс библиотеки для чтения к базе данных
public class ClassThatNeedsToReadDatabaseUsingLibrary
{
private DatabaseSettings dbSettings;
private LibraryClassThatNeedsConnectionString libraryClassThatNeedsConnectionString;
public ClassThatNeedsToReadDatabaseUsingLibrary(IOptions<DatabaseSettings> dbOptions)
{
this.dbSettings = dbOptions.Value;
this.libraryClassThatNeedsConnectionString = new LibraryClassThatNeedsConnectionString(this.dbSettings.ConnectionString);
}
public string ReadDatabaseUsingClassLibrary(int somePrimaryKeyIdToRead)
{
return this.libraryClassThatNeedsConnectionString.ReadTheDatabase(somePrimaryKeyIdToRead);
}
}
TL; DR
Старайтесь избегать использования настроек приложения в библиотеке классов. Вместо этого, чтобы ваша библиотека классов была несовместима с такими настройками, и пусть пользователь передает эти параметры.
Я видел, что тоже. Однако, кажется, действительно неэффективно загружать JSON-файл в каждый отдельный класс, который нуждается в информации о конфигурации. Например, что, если кому-то нужна строка подключения к базе данных. Должен быть какой-то способ загрузки информации о конфигурации один раз, чтобы она была доступна во всей области приложения. – user70192
@ user70192 проверить этот ответ на аналогичный вопрос: http://stackoverflow.com/questions/28232364/how-can-we-store-configuration-data-in-new-asp-net-vnext/28247809#28247809 it показывает, как захватить данные только * один раз * при запуске приложения, а затем использовать инъекцию зависимостей, чтобы любой другой компонент в приложении мог получать одни и те же данные. – Eilon