0

我正在尝试使用 GraphQL .Net 在我的 GraphQL 服务器上设置订阅。我遵循了QraphQL.Net文档和 Roland Guijt 的 PluralSight 课程中的文档,并在网上查找了更多信息。

我所拥有的看起来应该可以工作。我有我的订阅方法,它将 IObserverable 返回到事件流字段。我也尝试过使用函数来传递 IObserverable,但它仍然不起作用。

这是我的订阅

public class MyObjectSupscription : ObjectGraphType
    {
        private readonly MyObjectObservable _myObjectObservable;
        private readonly MyObjectSubjectHelper _myObjectSubjectHelper;
        public MyObjectSupscription(SportsEventObservable myObjectObservable, SportsEventSubjectHelper myObjectSubjectHelper)
        {
            Name = "Subscription";
            _sportsEventObservable = myObjectObservable;
            _sportsEventSubjectHelper = myObjectSubjectHelper;

            AddField(new EventStreamFieldType
            {
                Name = "MyObjectAdded",
                Type = typeof(MyObjectType),
                Resolver = new FuncFieldResolver<MyObject>(ResolveMessage),
                Subscriber = new EventStreamResolver<MyObject>(Subscribe),
            });
        }

        private IObservable<SportsEvent> Subscribe(IResolveEventStreamContext context)
        {
            return _myObjectObservable;
            // return _myObjectSubjectHelper.MyObjects(); //This uses a replaySubject as an observerable
        }

        private MyObject ResolveMessage(IResolveFieldContext context)
        {
            return context.Source as MyObject;
        }

当我跟踪代码并在 GraphQL .Net 包中放置断点时,它会进入 EventStream 订阅者

public class EventStreamResolver<T> : IEventStreamResolver<T>
    {
        private readonly Func<IResolveEventStreamContext, IObservable<T>> _subscriber;

        public EventStreamResolver(
            Func<IResolveEventStreamContext, IObservable<T>> subscriber)
        {
            _subscriber = subscriber ?? throw new ArgumentNullException(nameof(subscriber));
        }

        public IObservable<T> Subscribe(IResolveEventStreamContext context) => _subscriber(context);

        IObservable<object> IEventStreamResolver.Subscribe(IResolveEventStreamContext context) => (IObservable<object>)Subscribe(context);
    }

看起来它应该在我的 IObserverable 中调用 Subscribe 方法,但是没有达到我在此处放置的断点。

我的 Observerable 已在 AutoFac 中注册为 Singleton,并且我的 GraphQL 突变和查询工作,因此看起来 GraphQL 设置正确且工作正常。我的 observable 中的 notify 方法是在将 MyObject 添加到数据库后调用的。

4

1 回答 1

0

我查看了我的提交以使其正常工作,我认为我必须进行一些更改才能使订阅正常工作。

  1. 使用 I Subject 而不是创建 observables。这更方便,因为它包含了所需的可观察功能。
  2. 在 ReplaySubject 中将缓冲区大小设置为 1,以便立即发送消息。
  3. 升级到 GraphQL.Net V5。这与我创建的这个问题有关https://github.com/graphql-dotnet/graphql-dotnet/issues/2494
  4. 将测试从 GraphiQL 切换到 Altair。GraphiQL 似乎无法接收订阅,我不确定为什么,因为它确实触发了订阅但从未收到消息。

我在 GitHub https://github.com/graphql-dotnet/graphql-dotnet/issues/2494上有一个可以工作的示例项目

于 2021-06-21T19:14:37.513 回答