【问题标题】:How to access DI inside custom ConfigurationProvider如何在自定义 ConfigurationProvider 中访问 DI
【发布时间】:2020-10-29 19:22:31
【问题描述】:

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

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

我正在像这样调用扩展方法

return new ServiceCollection().AddConfigProviderServices()

这是 ConfigurationSource 类

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

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

【问题讨论】:

标签: c# asp.net-core


【解决方案1】:

我最终在 ConfigurationProvider 类中添加了另一个加载方法,它接受 IServiceProvider 作为参数,如下所示:

  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启动后调用自定义加载方法,并将其作为参数传入,如下所示:

[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);
    }

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

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多