通过 .NET 独立辅助角色,可以在任何受支持的 .NET 版本上运行 Durable Functions,而不受 Azure Functions 主机进程的影响。 此模型可让你完全控制依赖项注入、中间件和 .NET 版本控制。
在本文中,你将了解:
- Durable Functions 的孤立工作者的优点
- 所需包的初步设置
- 与进程内API和命名空间的主要区别
- 强类型化编排的源生成器和基于类的语法(预览版)
优点
.NET 独立辅助角色为 Durable Functions 应用提供了多项优势:
- 独立 .NET 版本控制: 在 .NET 8、.NET 9 或更高版本上运行应用,而无需等待 Functions 主机更新。
-
完全依赖注入: 在应用程序中使用标准 .NET
IServiceCollection/IServiceProvider模式。 - 自定义中间件: 通过 Functions 工作进程中间件管道添加日志记录、身份验证或错误处理等通用关注点。
-
直接输入注入:编排输入可以直接注入到触发方法签名中:
MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input) - 强类型调用(预览): 使用源生成器包,可以获取活动和子业务流程的编译时安全调用。 有关详细信息,请参阅源生成器和基于类的语法(预览版)。
有关独立辅助角色权益的完整列表,请参阅 独立辅助角色模型的好处。
开始
若要使用 .NET 独立辅助角色创建 Durable Functions 应用,请执行以下操作:
安装所需的 NuGet 包:
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.*" />用于协调服务使用
TaskOrchestrationContext和客户端操作使用DurableTaskClient。 有关完整演练,请参阅 快速入门教程 。
与进程内的主要区别
如果要从进程内模型迁移或与进程内模型进行比较,以下是主要区别:
| 面积 | 进行中 | .NET 隔离工作器 |
|---|---|---|
| NuGet 包 | Microsoft.Azure.WebJobs.Extensions.DurableTask |
Microsoft.Azure.Functions.Worker.Extensions.DurableTask |
| Orchestrator 上下文 | IDurableOrchestrationContext |
TaskOrchestrationContext |
| 客户端类型 | IDurableOrchestrationClient |
DurableTaskClient |
| 活动上下文 | IDurableActivityContext |
TaskActivityContext |
| 命名空间 | Microsoft.Azure.WebJobs.Extensions.DurableTask |
Microsoft.DurableTask / Microsoft.Azure.Functions.Worker |
| 重播安全记录器 | context.CreateReplaySafeLogger(log) |
context.CreateReplaySafeLogger("Name") |
有关涵盖项目设置、包引用、API 映射、行为差异和常见问题的综合迁移指南,请参阅 从进程内迁移到独立辅助角色模型。
源生成器和基于类的语法(预览版)
源生成器包提供基于函数的 Durable Functions 的替代方法。 而不是使用 [Function] 特性的静态方法,可以编写继承自 Durable SDK 的强类型类。
先决条件
将源生成器 NuGet 包添加到项目:
<PackageReference Include="Microsoft.DurableTask.Generators" Version="1.0.0" />
该包提供两项功能:
-
基于类的活动和协调——强类型的类,继承自
TaskOrchestrator<TInput, TOutput>和TaskActivity<TInput, TOutput>。 - 强类型扩展方法 - 用于调用子业务流程和活动的编译时安全方法。 这些扩展方法也适用于基于函数的编排。
示例
以下示例演示一个调用基于类活动的基于类编排:
using Microsoft.DurableTask;
[DurableTask]
public class MyOrchestration : TaskOrchestrator<string, string>
{
public override async Task<string> RunAsync(TaskOrchestrationContext context, string input)
{
return await context.CallActivityAsync<string>(nameof(MyActivity), input);
}
}
[DurableTask]
public class MyActivity : TaskActivity<string, string>
{
public override Task<string> RunAsync(TaskActivityContext context, string input)
{
return Task.FromResult($"Processed: {input}");
}
}
小窍门
对于不需要功能输入或输出的业务流程或活动,请使用 object? 泛型类型参数(例如, TaskOrchestrator<object?, object?>)。 此模式允许你在活动中使用依赖项注入(例如), ILogger<T>同时仍使用基于类的模型。
持久实体
.NET隔离进程支持可持久化实体。 有关详细信息,请参阅 开发人员指南。