.NET 独立工作器中的 Durable Functions 概述

通过 .NET 独立辅助角色,可以在任何受支持的 .NET 版本上运行 Durable Functions,而不受 Azure Functions 主机进程的影响。 此模型可让你完全控制依赖项注入、中间件和 .NET 版本控制。

在本文中,你将了解:

优点

.NET 独立辅助角色为 Durable Functions 应用提供了多项优势:

  • 独立 .NET 版本控制: 在 .NET 8、.NET 9 或更高版本上运行应用,而无需等待 Functions 主机更新。
  • 完全依赖注入: 在应用程序中使用标准 .NET IServiceCollection / IServiceProvider 模式。
  • 自定义中间件: 通过 Functions 工作进程中间件管道添加日志记录、身份验证或错误处理等通用关注点。
  • 直接输入注入:编排输入可以直接注入到触发方法签名中:MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input)
  • 强类型调用(预览): 使用源生成器包,可以获取活动和子业务流程的编译时安全调用。 有关详细信息,请参阅源生成器和基于类的语法(预览版)。

有关独立辅助角色权益的完整列表,请参阅 独立辅助角色模型的好处

开始

若要使用 .NET 独立辅助角色创建 Durable Functions 应用,请执行以下操作:

  1. 安装所需的 NuGet 包:

    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.*" />
    
  2. 用于协调服务使用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隔离进程支持可持久化实体。 有关详细信息,请参阅 开发人员指南

后续步骤