如何根据某个对象的 id 过滤订阅事件?

O.M*_*Koh 2 graphql graphql-subscriptions hotchocolate

我希望能够根据对象 ID 过滤某些操作的订阅。例如我想做这样的事情:

subscription{
  onTaskCompleted(taskId: "1"){
    taskCompleted{
      status
      items{
        reason
        iD
      }
    }
    taskFailed{
      status
      details{
        detail
        status        
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

仅当 ID 为“1”的任务完成时才会发出该事件。

是否有一种内置的方法可以HotChocolate使用某种类型的过滤来做到这一点?

或者

我是否必须自己添加这种类型的过滤,通过在解析器中执行类似的操作:

if(_taskIds.Contains(taskId))
{
   TaskCompletedExecution taskFinished = new TaskCompletedExecution(taskCompleted);
   await eventSender.SendAsync(nameof(TaskListSubscriptions.OnTaskCompleted), taskFinished, 
   cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Hog*_*vle 5

你可以这样做:

        [SubscribeAndResolve]
        public async IAsyncEnumerable<TaskCompletedExecution> OnTaskCompletedAsync(
            string taskId,
            [Service] ITopicEventReceiver eventReceiver,
            CancellationToken cancellationToken)
        {           
            var stream = await eventReceiver.SubscribeAsync<string, TaskCompletedExecution>(
                $"on-task-completed-{taskId}", cancellationToken);
            
            await foreach (var data in stream.ReadEventsAsync().WithCancellation(cancellationToken))
            {
                yield return data;
            }
        }
Run Code Online (Sandbox Code Playgroud)

要触发它,您可以将它们发布到on-task-completed-123,然后才会将其发送给提供123任务 ID 的订阅者。