Skip to content

Commit 6c4db99

Browse files
CopilotYunchuWang
andcommitted
Add strongly-typed SendEvent methods for DurableEventAttribute
- Added AddEventSendMethod to generate Send{EventName} extension methods - Generated methods provide type-safe way to send events between orchestrations - Updated all 3 event unit tests to verify SendEvent generation - All 41 generator tests passing - AzureFunctionsApp builds successfully with new methods Co-authored-by: YunchuWang <[email protected]>
1 parent a356142 commit 6c4db99

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/Generators/DurableTaskSourceGenerator.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ public static class GeneratedDurableTaskExtensions
344344
foreach (DurableEventTypeInfo eventInfo in allEvents)
345345
{
346346
AddEventWaitMethod(sourceBuilder, eventInfo);
347+
AddEventSendMethod(sourceBuilder, eventInfo);
347348
}
348349

349350
if (isDurableFunctions)
@@ -452,6 +453,19 @@ static void AddEventWaitMethod(StringBuilder sourceBuilder, DurableEventTypeInfo
452453
}}");
453454
}
454455

456+
static void AddEventSendMethod(StringBuilder sourceBuilder, DurableEventTypeInfo eventInfo)
457+
{
458+
sourceBuilder.AppendLine($@"
459+
/// <summary>
460+
/// Sends an external event of type <see cref=""{eventInfo.TypeName}""/> to another orchestration instance.
461+
/// </summary>
462+
/// <inheritdoc cref=""TaskOrchestrationContext.SendEvent(string, string, object)""/>
463+
public static void Send{eventInfo.EventName}(this TaskOrchestrationContext context, string instanceId, {eventInfo.TypeName} eventData)
464+
{{
465+
context.SendEvent(instanceId, ""{eventInfo.EventName}"", eventData);
466+
}}");
467+
}
468+
455469
static void AddActivityFunctionDeclaration(StringBuilder sourceBuilder, DurableTaskTypeInfo activity)
456470
{
457471
// GeneratedActivityContext is a generated class that we use for each generated activity trigger definition.

test/Generators.Tests/ClassBasedSyntaxTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,15 @@ public sealed record ApprovalEvent(bool Approved, string? Approver);";
533533
public static Task<ApprovalEvent> WaitForApprovalEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default)
534534
{
535535
return context.WaitForExternalEvent<ApprovalEvent>(""ApprovalEvent"", cancellationToken);
536+
}
537+
538+
/// <summary>
539+
/// Sends an external event of type <see cref=""ApprovalEvent""/> to another orchestration instance.
540+
/// </summary>
541+
/// <inheritdoc cref=""TaskOrchestrationContext.SendEvent(string, string, object)""/>
542+
public static void SendApprovalEvent(this TaskOrchestrationContext context, string instanceId, ApprovalEvent eventData)
543+
{
544+
context.SendEvent(instanceId, ""ApprovalEvent"", eventData);
536545
}");
537546

538547
return TestHelpers.RunTestAsync<DurableTaskSourceGenerator>(
@@ -565,6 +574,15 @@ public class MyEventData
565574
public static Task<MyEventData> WaitForCustomEventNameAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default)
566575
{
567576
return context.WaitForExternalEvent<MyEventData>(""CustomEventName"", cancellationToken);
577+
}
578+
579+
/// <summary>
580+
/// Sends an external event of type <see cref=""MyEventData""/> to another orchestration instance.
581+
/// </summary>
582+
/// <inheritdoc cref=""TaskOrchestrationContext.SendEvent(string, string, object)""/>
583+
public static void SendCustomEventName(this TaskOrchestrationContext context, string instanceId, MyEventData eventData)
584+
{
585+
context.SendEvent(instanceId, ""CustomEventName"", eventData);
568586
}");
569587

570588
return TestHelpers.RunTestAsync<DurableTaskSourceGenerator>(
@@ -598,6 +616,15 @@ public record DataReceivedEvent(int Id, string Data);
598616
public static Task<MyNS.DataReceivedEvent> WaitForDataReceivedEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default)
599617
{
600618
return context.WaitForExternalEvent<MyNS.DataReceivedEvent>(""DataReceivedEvent"", cancellationToken);
619+
}
620+
621+
/// <summary>
622+
/// Sends an external event of type <see cref=""MyNS.DataReceivedEvent""/> to another orchestration instance.
623+
/// </summary>
624+
/// <inheritdoc cref=""TaskOrchestrationContext.SendEvent(string, string, object)""/>
625+
public static void SendDataReceivedEvent(this TaskOrchestrationContext context, string instanceId, MyNS.DataReceivedEvent eventData)
626+
{
627+
context.SendEvent(instanceId, ""DataReceivedEvent"", eventData);
601628
}");
602629

603630
return TestHelpers.RunTestAsync<DurableTaskSourceGenerator>(

0 commit comments

Comments
 (0)