C# 在配置依赖项注入之后,但在第一个http请求之前初始化单例

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>();

我正在使用Azure功能版本2.x。是的

因此,我可以在singleton范围内为DI注册我的服务IMyService,使用:

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配置提供初始化对象,或
  • 在注册阶段之后,在第一个请求之前,直接解析和调用对象图,以便可以初始化数据

部署后,安排诊断方法调用。此测试不仅可以测试运行状况,还可以使函数处于温暖状态,为第一次客户端调用做准备。其他依赖项如何/在何处注册?@Nkosi使用相同的方法,但在IMyService之前注册。它还取决于调用Configure之前由函数app host预先注册的iLogger工厂。我编辑了有问题的代码示例以使其更清晰。
public void Configure(IApplicationBuilder app, IFoo foo) 
{
    ...
}