根据注入的用户选项IOptions<>注入DataProtection在ConfigureServices中

时间:2017-02-07 13:59:05

标签: c# dependency-injection asp.net-core

关于如何根据ConfigureServices(IServiceCollection services)中注入的用户设置在services.Configure<UserSettingsConfig>(Configuration.GetSection("UserSettings"));中注入DataProtection,我有点困惑。

下面的appName_from_appsettings_jsondirInfo_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);
}

我已经找到了实现目标的方法,而不使用像var sharedDataProtectionAppName = configuration.GetValue<string>("UserSettings:SharedDataProtection:ApplicationName");

这样的代码的DI

我觉得我在本文http://andrewlock.net/access-services-inside-options-and-startup-using-configureoptions/中找到了解决方案似乎我无法弄清楚如何将它应用到我的案例中。我需要一种方法来根据注入的DataProtection中的值注入IOptions<UserSettingsConfig>。在你看来,最干净的方法是什么?

更新:我找到了一个基于我可以从ConfigureServices调用的代码类型的解决方案,但我仍然想知道它是否是最佳方式。

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

1 个答案:

答案 0 :(得分: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);