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

How to use dependency injection in Azure Durable Functions?

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

我设置了使用 TimeTrigger 触发的简单启动功能。此功能负责启动编排器。编排器并行执行多个活动。大约有 40000 个工作项要处理,这就是编排器触发的活动数。其中一些活动需要更新数据库(insert/update/delete 行)。为此,我需要一个数据库连接。我可以通过以下方式在 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>();
        }
    }

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

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

我该如何解决?

I want to create an Azure Durable Function that will download a CSV from the Internet and based on the data in this file, it will update my database using EntityFramework.

在StartUp中按以下方式配置DI:

public override void Configure(IFunctionsHostBuilder builder) {
    var connectionString = Environment.GetEnvironmentVariable("DefaultConnection");

    builder.Services.AddDbContext<IDbContext, SqlContext>(options => 
        options.UseSqlServer(connectionString)); //To inject DbContext

    builder.Services.AddHttpClient(); //To inject HttpClient
}

确保你在 Azure Functions Runtime V3+ 上托管你的函数应用程序,这样 class 和方法 不必是 static.

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

public class MyFunction {
    private readonly HttpClient httpClient;
    private readonly IDbContext dbContext;

    //ctor
    public MyFunction(IHttpClientFactory factory, IDbContext dbContext) {
        httpClient = factory.CreateClient();
        this.dbContext = dbContext;
    }

    [FunctionName("Function_Name_Here")]
    public async Task Run(
        [OrchestrationTrigger] IDurableOrchestrationContext context) {

        // ... access dependencies here

    }

    // ... other functions, which can include static, but they wont
    // have access to the instance fields.
}

本系列文章可能对您有所帮助

A Practical Guide to Azure Durable Functions — Part 2: Dependency Injection