我已经实现了海关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构造函数中完成的。我只能注入该构造函数中可用的依赖项:IWebHostEnvironment
,IHostEnvironment
,IConfiguration
以及在构建WebHost时添加的所有依赖项。同样,在我调用AddMyConfiguration
扩展方法时,也必须传递这些依赖项。我该如何使用当时甚至不存在的依赖项?
答案 0 :(得分:0)
答案有点晚。
很明显,无法使用在3
/ y(i) = Cells(i + 2, 2)
中使用Startup.ConfigureServices
构建的容器,这仅仅是因为在调用MyConfigurationSource
时,{ {1}}尚未被调用。
典型的解决方法是使用所需配置创建MyConfigurationProvider
的另一个实例,并在ConfigurationBuilder.Build
内部使用它。
类似
ServiceCollection.BuildServiceProvider
但这可能并不总是合适的,因此我也将考虑直接设置该值(尽管我没有找到任何有关此方法有多好的官方信息)
IServiceProvider