关于如何根据ConfigureServices(IServiceCollection services)
中注入的用户设置在services.Configure<UserSettingsConfig>(Configuration.GetSection("UserSettings"));
中注入DataProtection,我有点困惑。
下面的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);
}
我已经找到了实现目标的方法,而不使用像var sharedDataProtectionAppName = configuration.GetValue<string>("UserSettings:SharedDataProtection:ApplicationName");
我觉得我在本文http://andrewlock.net/access-services-inside-options-and-startup-using-configureoptions/中找到了解决方案似乎我无法弄清楚如何将它应用到我的案例中。我需要一种方法来根据注入的DataProtection
中的值注入IOptions<UserSettingsConfig>
。在你看来,最干净的方法是什么?
更新:我找到了一个基于我可以从ConfigureServices
调用的代码类型的解决方案,但我仍然想知道它是否是最佳方式。
var userSettingsConfig = services.BuildServiceProvider().GetServices<IOptions<UserSettingsConfig>>().First();
答案 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);