2016-04-28 3 views
1

Справочная информация: сайт Asp.Net ядра с помощью Dependency Injection для передачи необходимых услуг к различным частям сайтаДинамически Обновление Dependency Injection Service

У меня есть сервис, который добавляется к IServiceCollection в методе ConfigureServices в моем запуске класс как одноточечного следующим образом:

//Settings 
services.AddSingleton<ISettingsService, SettingsService>(); 
services.AddSingleton<ISettingsIO, SettingsIO>(); 
services.AddSingleton<ISettings>(f => 
{ 
    return f.GetService<ISettingsService>().GetSettings(); 
}); 

Это прекрасно работает и все страницы/контроллеры мне нужно иметь доступ к примеру, может сделать это без проблем.

Однако теперь у меня есть возможность изменить данные, которые вытягивают в методе GetSettings(). Это означает, что мне нужно обновить службу, которая будет добавлена ​​в ServiceCollection.

Как это сделать без смена службы от однотонального к переходному?

Благодарим за предоставленную помощь!

+0

Как реализуется «GetSettings»? –

+1

Я не понимаю, почему 'ISetting' также является singleton, поскольку' ISettingsService' уже установлен. Почему бы не использовать его как переходный или ограниченный, и разрешить ли это настройке «SettingsService»? –

+0

@YacoubMassad - GetSiteSettings возвращает объект ISiteSettings, который он создает из запроса в БД. – khrave

ответ

1

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

Создать изменяемый класс настройки обертку:

public class MyMutableSettings : ISettings 
{ 
    public ISettings Settings {get;set;} 

    //Implement the ISettings interface by delegating to Settings, e.g.: 
    public int GetNumberOfCats() 
    { 
     return Settings.GetNumberOfCats(); 
    } 
} 

И тогда вы можете использовать его как это:

MyMutableSettings mySettings = new MyMutableSettings(); 

services.AddSingleton<ISettings>(f => 
{ 
    mySettings.Settings = f.GetService<ISettingsService>().GetSettings(); 

    return mySettings; 
}); 

Затем, когда вы хотите изменить настройки:

mySettings.Settings = GetMyNewSettings();