Если у вас есть класс, который извлекает ваши настройки из базы данных:
public class SqlSettingsProvider : ISettingsProvider
{
private readonly string _connectionString;
public SqlSettingsProvider(string connectionString)
{
_connectionString = connectionString;
}
public Settings GetSettings()
{
// load the settings from SQL
}
}
Вы можете зарегистрировать этот класс с помощью ServiceCollection
:
var connectionString = "xyz"; // load this from config;
services.AddSingleton<SqlSettingsProvider>(provider =>
new SqlSettingsProvider(connectionString));
(у вас может быть интерфейс типа ISettingsProvider
, но в этом примере он не нужен, потому что вы собираетесь ввести Settings
, а не провайдер настроек.)
Затем настройте свой набор служб для разрешения Settings
, разрешив SqlSettingsProvider
и используя его для получения экземпляра Settings
.
services.AddSingleton<Settings>(provider =>
provider.GetService<SqlSettingsProvider>().GetSettings());
Теперь, где вам нужно Settings
вы просто вводите их:
public class SomeControllerOrOtherClass
{
private readonly Settings _settings;
public SomeControllerOrOtherClass(Settings settings)
{
_settings = settings;
}
}
Теперь ваши уроки могут зависеть от Settings
, и не важно, откуда они берутся. Коллекция сервисов будет создавать ее только один раз, а затем каждый раз будет возвращать один и тот же экземпляр, а это значит, что из базы данных она будет найдена только один раз.
Внедрение интерфейса, подобного ISettingsProvider
, может дать долгосрочную выгоду. Это дает вам немного больше гибкости. Например, вместо сохранения Settings
на протяжении всего времени жизни приложения оно может кэшировать их в течение заданного периода времени, или оно может вести себя по-другому.