azure - 如何在 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 持久函数,该函数将从 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.
}
本系列文章或许对你有所帮助
推荐阅读
- node.js - 如何在reactJS中初始化未知长度的数组状态?
- sparkpost - Sparkpost API:每个收件人使用不同模板的批量邮件
- python-3.x - 将数据框中的时间戳转换为python中的日期和时间
- selenium - gradle、cucumber 和 selenium 的警告
- sql - 从 Bigquery 中的另一个表运行 Where 子句
- laravel - Laravel 护照设置会话
- java - Avro 能否返回对对象的引用而不是对象
- docker - docker-compose 多网络私有和互联网
- android - ImageView 不在屏幕中央
- apache-spark - 不理解结构化流中的更新模式和水印