ASP.NET Core 2.x注册需要IConfigurationRoot的服务 - 无法访问配置数据

问题描述 投票:0回答:1

配置已在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的类?

c# asp.net-core configuration asp.net-core-2.1
1个回答
1
投票

不确定为什么需要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();
}
© www.soinside.com 2019 - 2024. All rights reserved.