如何在自定义ConfigurationProvider中访问DI [英] How to access DI inside custom ConfigurationProvider

查看:77
本文介绍了如何在自定义ConfigurationProvider中访问DI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在实现自定义ConfigurationProvider,并且具有以下扩展方法

I am implementing a custom ConfigurationProvider and I have the following extension method in place

 public static class ConfigurationExtensions
    {
        public static IConfigurationBuilder AddConfigProviderConfiguration(this IConfigurationBuilder configuration)
        {
            configuration.Add(new ConfigurationSource());
            return configuration;
        }
    }

我正在这样调用扩展方法

And I am calling the extension method like this

return new ServiceCollection().AddConfigProviderServices()

这是ConfigurationSource类

This is the ConfigurationSource class

 public class ConfigurationSource : IConfigurationSource
    {
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        { 
            return new ConfigurationProvider(this);
        }
    }

在ConfigurationProvider内部,我希望能够注入或以某种方式访问​​已注册为DI的依赖项(如ILogger).如何访问依赖项?

Inside the ConfigurationProvider I would like to be able to inject or somehow access dependencies like ILogger, that I have registered as DI. How can I access the dependencies?

推荐答案

我最终在ConfigurationProvider类中添加了另一个加载方法,该方法将IServiceProvider作为这样的参数:

I ended up adding another load method inside the ConfigurationProvider class that takes in IServiceProvider as a parameter like this:

  public class ConfigurationProvider : Microsoft.Extensions.Configuration.ConfigurationProvider
    {
        public void Load(IServiceProvider serviceProvider)
        {
            var logger = serviceProvider.GetRequiredService<ILogger<ConfigurationProvider>>();
// Get other services using serviceProvider, e.g. dbContext and call  Set(s.Key, s.Value); accordingly

在启动ServiceProvier之后,下一步调用自定义加载方法,并将其作为这样的参数传递:

Next call the custom load method after ServiceProvier has been initiated and pass it in as a parameter like this:

[TestInitialize()]

    public void InitializeTest()
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory
                .GetCurrentDirectory()) //From NuGet Package Microsoft.Extensions.Configuration.Json
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddConfigProviderConfiguration()
            .Build();
    
        serviceProvider = ServiceProvider.BuildDi(config);
        
        var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
        loggerFactory.AddProvider(new LoggerProvider(config));
    
        var provider = config.Providers.FirstOrDefault(p => p is ConfigurationProvider);
        var cp = (ConfigurationProvider)provider;
        cp.Load(serviceProvider);
    }

不是最好的解决方案,但它可以工作,并且可以从ConfigurationProvider中访问所有DI依赖项.

Not the nicest solution but it works and all the DI dependencies are accessible from within ConfigurationProvider.

这篇关于如何在自定义ConfigurationProvider中访问DI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆