c# - 在配置依赖注入(inject)之后但在第一个 http 请求之前初始化单例

标签 c# dependency-injection azure-functions

我使用的是 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 在第一个请求之前创建?

A similar question被问及 asp.net core,那里的答案提出了一些解决方案,但没有一个适用于函数应用程序的上下文:

选项 1:创建我的服务实例(此处进行初始化),然后注册实例(而不是注册类型)

var foo = new Foo();
services.AddSingleton<IFoo>(foo);

这不起作用,因为在我的例子中,IMyService 依赖于其他服务,当我在 Configure 中注册 IMyService 时,这些服务并未实例化 方法。它失败并出现描述为 here 的错误.

选项 2:其他建议是使用重载的 Configure 方法:

public void Configure(IApplicationBuilder app, IFoo foo) 
{
    ...
}

这也不起作用,因为在函数应用程序的情况下,唯一被执行的配置方法是 Configure(IFunctionsHostBuilder builder),并且不会调用其他重载。

最佳答案

because it does heavy initialization that happens inside DefaultMyService

这就是问题的核心所在。正如 Mark Seemann 解释的那样here ,注入(inject)构造函数不应该做更多的检查 null 和存储传入的依赖项。任何时候您在构造函数内部执行任何 I/O 或调用类的依赖项时,您都会遇到麻烦。

您的问题似乎类似于 this q/a ,我的建议是相同的:从构造函数中提取初始化逻辑,然后执行以下操作:

  • 在连接对象图之前进行初始化,并为 DI 配置提供初始化对象,或者
  • 在注册阶段之后、第一次请求之前直接解析和调用对象图,以便可以初始化数据。

关于c# - 在配置依赖注入(inject)之后但在第一个 http 请求之前初始化单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56419724/

相关文章:

c# - 在 C# : Add Quotes around string in a comma delimited list of strings 中

c# - ASP.NET MVC + WIndsor + Log4Net 如何拦截模型?

symfony - 安装 Symfony 时出错,声明 DependencyInjection PSR php,怎么办?

scala - Play 2.7 中的 RequestScoped

Azure 函数 - 将功能键添加到 Http 触发器或连接字符串会导致停机吗?

c# - 多列上不区分大小写的组

c# - 返回计数列表并按 id linq to sql 分组

.net - 当类型 T 的祖先时 Ninject 绑定(bind)

azure - Visual Studio 2017 中的 local.settings.json 本地开发中缺少 AzureWebJobsStorage 的值

Azure 事件中心 : Receive events as a batch that were sent to hub as individual messages?