我正在使用Azure Functions 2.x版本。它有built-in support for dependency injection。
因此,我可以使用以下方法在单例范围内为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.
}
}
函数第一次执行时创建DefaultMyService
的实例。这意味着第一个请求的速度较慢,因为它会在DefaultMyService
内部进行大量初始化(填充缓存等)。
问题:是否可以在第一个请求之前创建DefaultMyService
?
一个similar question被要求使用asp.net内核,那里的答案提出了一些解决方案,但是它们都不在函数应用程序的上下文中起作用:
选项1:创建我的服务的实例(此处会进行初始化),然后注册该实例(而不是注册类型)
var foo = new Foo();
services.AddSingleton<IFoo>(foo);
这不起作用,因为在我的情况下,IMyService
依赖于其他服务,这些服务在我在IMyService
方法中注册Configure
时未实例化。它失败,并显示描述为here的错误。
选项2:其他建议是使用重载的Configure方法:
public void Configure(IApplicationBuilder app, IFoo foo)
{
...
}
这也不起作用,因为在使用功能应用程序的情况下,唯一执行的配置方法是Configure(IFunctionsHostBuilder builder)
,并且不会调用其他重载。