C# 在配置依赖项注入之后,但在第一个http请求之前初始化单例
我正在使用Azure功能版本2.x。是的 因此,我可以在singleton范围内为DI注册我的服务IMyService,使用:C# 在配置依赖项注入之后,但在第一个http请求之前初始化单例,c#,dependency-injection,azure-functions,C#,Dependency Injection,Azure Functions,我正在使用Azure功能版本2.x。是的 因此,我可以在singleton范围内为DI注册我的服务IMyService,使用: public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddSingleton<IOther, DefaultOther>();
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<IOther, DefaultOther>();
builder.Services.AddSingleton<IMyService, DefaultMyService>(); // IMyService depends on IOther.
}
}
这不起作用,因为在我的情况下,IMyService
依赖于其他服务,这些服务在我在Configure
方法中注册IMyService
时没有实例化。它失败了,出现了如上所述的错误
选项2:其他建议是使用重载配置方法:
public void Configure(IApplicationBuilder app, IFoo foo)
{
...
}
这也不起作用,因为在函数app中,唯一执行的配置方法是configure(iffunctionshostbuilder)
,并且不调用其他重载
因为它在DefaultMyService内部进行了大量初始化
这就是问题的核心所在。正如MarkSeemann解释的,注入构造函数不应该做更多的检查null和存储传入的依赖项。每当您在构造函数中执行任何I/O或调用类的依赖项时,您都会遇到麻烦
您的问题似乎与类似,我的建议也一样:从构造函数中提取初始化逻辑,然后执行以下操作之一:
- 在连接对象图之前进行初始化,并向DI配置提供初始化对象,或
- 在注册阶段之后,在第一个请求之前,直接解析和调用对象图,以便可以初始化数据
public void Configure(IApplicationBuilder app, IFoo foo)
{
...
}