Код: Выделить всё
[JsonDerivedType(typeof(IntegrationEventBase), typeDiscriminator: "IntegrationEventBase")]
[JsonDerivedType(typeof(WorkItemIntegrationEventBase), typeDiscriminator: "WorkItemIntegrationEventBase")]
public class IntegrationEventBase
{
public string? Traceparent { get; set; }
}
[JsonDerivedType(typeof(WorkItemCreatedIntegrationEvent), typeDiscriminator: "WorkItemCreatedIntegrationEvent")]
[JsonDerivedType(typeof(WorkItemProgressedIntegrationEvent), typeDiscriminator: "WorkItemProgressedIntegrationEvent")]
public class WorkItemIntegrationEventBase : IntegrationEventBase
{
public string? WorkItemId { get; set; }
public ushort? Quantity { get; set; }
}
public class WorkItemCreatedIntegrationEvent : WorkItemIntegrationEventBase
{
}
public class WorkItemProgressedIntegrationEvent : WorkItemIntegrationEventBase
{
public WorkItemStatus Status { get; set; }
}
Это просто десериализация события, полученного из службы «Сетка событий», и передача его в качестве входных данных оркестратора.
Код: Выделить всё
[Function("WorkItemProgressedIntegrationEventHandler")]
public async Task WorkItemProgressedIntegrationEventHandler([EventGridTrigger] EventGridEvent eventGridEvent,
[DurableClient] DurableTaskClient client,
FunctionContext executionContex)
{
var @event = _serializer.Deserialize(eventGridEvent.Data.ToString());
await client.ScheduleNewOrchestrationInstanceAsync(
Constants.WORKFLOW_ORCHESTRATOR, @event);
}
Оркестратор получает WorkItemIntegrationEventBase, а затем вызывает объект одним из двух разных способов в зависимости от фактического внутренний тип события (полиморфизм).
Код: Выделить всё
[Function("Orchestrator")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] TaskOrchestrationContext context, WorkItemIntegrationEventBase @event)
{
var entityId = BuildEntityIds(@event);
if (@event is WorkItemCreatedIntegrationEvent createdEvent)
await context.Entities.SignalEntityAsync(workflowEntityId, nameof(IDurableWorkflow.EnqueueWork),
WorkItemInput.FromWorkItemIntegrationEvent(createdEvent));
else if (@event is WorkItemProgressedIntegrationEvent progressedEvent)
await context.Entities.SignalEntityAsync(workflowEntityId, nameof(IDurableWorkflow.ProgressWork),
WorkItemInput.FromWorkItemIntegrationEvent(progressedEvent));
}
Я попробовал почти все, что здесь указано, но безуспешно, я, должно быть, что-то упускаю.
Подробнее здесь: https://stackoverflow.com/questions/783 ... chestrator