配置已在Program.cs中的我的应用程序中注册,如此
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("appsettings.secret.json", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>()
.ConfigureLogging(logging =>
{override configuration in NLog.config
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog(); // NLog: setup NLog for Dependency injection;
我有一个类需要一个IConfigurationRoot实例
public class ConfiguredKeyDataProtectionProvider : IDataProtectionProvider
{
// Example configuration required for use of this class
// {
// "ConfiguredKeyDataProtectionProvider": {
// "Key": {
// "TestPurpose": "asda2516shah"
// }
// }
// }
private readonly IConfigurationRoot _configurationRoot;
public ConfiguredKeyDataProtectionProvider(IConfigurationRoot configurationRoot)
{
_configurationRoot = configurationRoot;
}
public IDataProtector CreateProtector(string purpose)
{
string encryptionKey = _configurationRoot.GetValue<string>("ConfiguredKeyDataProtectionProvider:Key:" + purpose);
return new ConfiguredKeyDataProtector(encryptionKey);
}
}
我正在尝试通过DI注册IConfiguredKeyDataProtectionProvider的实例。我希望已经注册了一个IConfiguration root实例(注意在StartUp.cs中读取配置文件是重复的 - 不确定是否有必要),IConfiguredKeyDataProtectionProvider将能够看到配置数据,但这似乎不是案子。
public class Startup
{
public Startup(IHostingEnvironment env)
{
var configurationRoot = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile("appsettings.secret.json", optional: true, reloadOnChange: true)
.Build();
Configuration = configurationRoot;
}
public IConfigurationRoot Configuration { get; set; }
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfigurationRoot>(Configuration);
//...
services.AddTransient<IDataProtectionProvider, ConfiguredKeyDataProtectionProvider>();
我应该如何正确配置我的应用程序,以便可以通过依赖注入注册构造函数上带有IConfigurationRoot的类?
不确定为什么需要IConfigurationRoot
接口,但由于在构造主机之前已经构建了IConfigurationRoot
实例,因此可以通过.ConfigureServices(services =>{services.AddSingleton<IConfigurationRoot>(configRoot);})
将root注册为单例服务:
此外,没有必要两次构建配置,只需调用UseConfiguration(congfigRoot)
。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
// build the root
var configRoot = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false)
// ...
.Build();
var builder = new WebHostBuilder();
return builder
// reuse the configRoot
.UseConfiguration(configRoot)
// register the configRoot as a singleton service
.ConfigureServices(services =>{
services.AddSingleton<IConfigurationRoot>(configRoot);
})
.UseStartup<Startup>()
.ConfigureLogging(logging => {
//override configuration in NLog.config
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseKestrel();
}