如何在 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
我想创建一个 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