如何在 Azure Durable Functions 中使用依赖注入?

Mic*_* B. 3 dependency-injection azure .net-core azure-functions azure-durable-functions

我想创建一个 Azure Durable Function,它将从 Internet 下载 CSV,并根据此文件中的数据,使用 EntityFramework 更新我的数据库。

我设置了使用 TimeTrigger 触发的简单启动功能。该函数负责启动协调器。协调器并行执行多个活动。大约有 40000 个工作项需要处理,这就是 Orchestrator 触发的活动数量。其中一些活动需要更新数据库(插入/更新/删除行)。为此,我需要一个数据库连接。我可以通过以下方式在 StartUp 中配置 DI:

public override void Configure(IFunctionsHostBuilder builder)
        {
            var connectionString = Environment.GetEnvironmentVariable("DefaultConnection");
            builder.Services.AddDbContext<SqlContext>(options => options.UseSqlServer(connectionString));
            builder.Services.AddScoped<IDbContext, SqlContext>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然而,我的所有函数(协调器、活动函数等)都是静态的,并且驻留在静态类中。我还没有看到任何在非静态类中定义持久函数的例子,当我自己尝试时,我遇到了各种各样的问题,所以我假设它们必须是静态的,而无需深入研究它。

我不知道如何将我的DbContext对象传递给 Activity 函数,以便它可以在需要时更新数据库中的数据。

我该如何解决呢?

Nko*_*osi 7

\n

我想创建一个 Azure Durable Function,它将从 Internet 下载 CSV,并根据此文件中的数据,使用 EntityFramework 更新我的数据库。

\n
\n

通过以下方式在 StartUp 中配置 DI:

\n
public override void Configure(IFunctionsHostBuilder builder) {\n    var connectionString = Environment.GetEnvironmentVariable("DefaultConnection");\n\n    builder.Services.AddDbContext<IDbContext, SqlContext>(options => \n        options.UseSqlServer(connectionString)); //To inject DbContext\n\n    builder.Services.AddHttpClient(); //To inject HttpClient\n}\n
Run Code Online (Sandbox Code Playgroud)\n

确保在 Azure Functions Runtime V3+ 上托管函数应用,因此类和方法don\xe2\x80\x99t 必须是 静态的

\n

这将允许常规类具有带有可注入参数的非静态构造函数

\n
public class MyFunction {\n    private readonly HttpClient httpClient;\n    private readonly IDbContext dbContext;\n\n    //ctor\n    public MyFunction(IHttpClientFactory factory, IDbContext dbContext) {\n        httpClient = factory.CreateClient();\n        this.dbContext = dbContext;\n    }\n\n    [FunctionName("Function_Name_Here")]\n    public async Task Run(\n        [OrchestrationTrigger] IDurableOrchestrationContext context) {\n\n        // ... access dependencies here\n\n    }\n\n    // ... other functions, which can include static, but they wont\n    // have access to the instance fields.\n}\n
Run Code Online (Sandbox Code Playgroud)\n

本系列文章或许对您有帮助

\n

Azure Durable Functions 实用指南 \xe2\x80\x94 第 2 部分:依赖项注入

\n