具有其他依赖项的ConfigurationProvider

时间:2020-05-29 07:02:23

标签: c# .net-core dependency-injection configuration

我已经实现了海关IConfigurationProvider和IConfigurationSource。

public class MyConfigurationSource : IConfigurationSource
{
    public string Foo { get; set; }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new MyConfigurationProvider(this);
    }
}

internal class MyConfigurationProvider : ConfigurationProvider
{
    public MyConfigurationSource Source { get; };

    public MyConfigurationProvider()
    {
        Source = source
    }

    public override void Load()
    {
        // I'd like to assign here my configuration data by using some dependencies
        Data = .... 
    }
}

我在Startup构造函数中进行Configuration的构建(我覆盖了CreateDefaultBuilder创建的配置):

var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables()
        .AddMyConfiguration("myfoovalue")
        .Build();

扩展方法:

public static IConfigurationBuilder AddMyConfiguration(this IConfigurationBuilder builder, string foo)
{
    return builder.Add(new MyConfigurationSource 
        {
            Foo = url
        });
}

我希望我能以某种方式注入要在Load方法中使用的服务。这里的问题是配置build是在Startup构造函数中完成的。我只能注入该构造函数中可用的依赖项:IWebHostEnvironmentIHostEnvironmentIConfiguration以及在构建WebHost时添加的所有依赖项。同样,在我调用AddMyConfiguration扩展方法时,也必须传递这些依赖项。我该如何使用当时甚至不存在的依赖项?

1 个答案:

答案 0 :(得分:0)

答案有点晚。

很明显,无法使用在3 / y(i) = Cells(i + 2, 2)中使用Startup.ConfigureServices构建的容器,这仅仅是因为在调用MyConfigurationSource时,{ {1}}尚未被调用。

典型的解决方法是使用所需配置创建MyConfigurationProvider的另一个实例,并在ConfigurationBuilder.Build内部使用它。

类似

ServiceCollection.BuildServiceProvider

但这可能并不总是合适的,因此我也将考虑直接设置该值(尽管我没有找到任何有关此方法有多好的官方信息)

IServiceProvider