首页 > 解决方案 > 如何在 Azure Durable Functions 中使用依赖注入?

问题描述

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

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

但是,我的所有功能(协调器、活动功能等)都是静态的,并且驻留在静态类中。我还没有看到任何在非静态类中定义持久函数的示例,当我自己尝试时遇到了各种问题,所以我认为它们必须是静态的,而不需要过多地研究它。

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

我应该如何解决?

标签: azure.net-coredependency-injectionazure-functionsazure-durable-functions

解决方案


我想创建一个 Azure 持久函数,该函数将从 Internet 下载 CSV,并根据此文件中的数据,使用 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+ 上托管函数应用,这样类和方法就不必是 static

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

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.
}

本系列文章或许对你有所帮助

Azure Durable Functions 实用指南 - 第 2 部分:依赖注入


推荐阅读