2017-02-07 1 views
0

Я немного запутался здесь относительно того, как вводить DataProtection в ConfigureServices(IServiceCollection services) на основе пользовательских настроек, которые также вводятся с services.Configure<UserSettingsConfig>(Configuration.GetSection("UserSettings"));.Inject DataProtection на основе введенных пользовательских параметров IOptions <> в ConfigureServices

Значения appName_from_appsettings_json и dirInfo_from_appsettings_json ниже должно исходить из нагнетаемой UserSettingsConfig и будет доступен в другом месте, вводя IOptions<UserSettingsConfig>, но не здесь.

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.Configure<UserSettingsConfig>(Configuration.GetSection("UserSettings")); 
    services.AddMvc(); 
    services.AddScoped<DevOnlyActionFilter>(); 

    services.AddDataProtection() 
     .SetApplicationName(appName_from_appsettings_json) 
     .PersistKeysToFileSystem(dirInfo_from_appsettings_json); 
} 

Я нашел пути для достижения своих целей без использования DI с кодом, как var sharedDataProtectionAppName = configuration.GetValue<string>("UserSettings:SharedDataProtection:ApplicationName");

У меня было чувство, что я нашел решение в этой статье http://andrewlock.net/access-services-inside-options-and-startup-using-configureoptions/ по мне кажется, что я не могу понять, как применить его к моему делу. Мне нужно было бы ввести DataProtection на основе значений от введенного IOptions<UserSettingsConfig>. Каким будет самый чистый способ сделать это, на ваш взгляд?

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

var userSettingsConfig = services.BuildServiceProvider().GetServices<IOptions<UserSettingsConfig>>().First(); 

ответ

1

Вы также можете использовать способ расширения .Bind(). Этот метод попытается связать значение с объектом Configuration, сопоставив ключи из конфигурации.

// Add framework services. 
var userSettingsConfig = new UserSettingsConfig(); 
Configuration.GetSection("UserSettings").Bind(userSettingsConfig); 
services.Configure<UserSettingsConfig>(Configuration.GetSection("UserSettings")); 

services.AddMvc(); 
services.AddScoped<DevOnlyActionFilter>(); 

services.AddDataProtection() 
    .SetApplicationName(userSettingsConfig.appName) 
    .PersistKeysToFileSystem(userSettingsConfig.DirInfo); 
+0

Спасибо, я думаю, это лучше, чем извлечение UserSettings CONFIG от поставщика услуг, как я делаю прямо сейчас ('вар userSettingsConfig = services.BuildServiceProvider(). GetServices >(). Во-первых(); '). – Daboul

+0

Я попробую завтра. – Daboul

+0

Он работает, без разрешения DI, спасибо. – Daboul

Смежные вопросы