GraphQL .Net 订阅 EventStreamFieldType 未订阅 IObserverable
GraphQL .Net Subscriptions EventStreamFieldType not Subscribing to IObserverable
我正在尝试使用 GraphQL .Net 在我的 GraphQL 服务器上设置订阅。我遵循了 QraphQL.Net 文档和 Roland Guijt 的 PluralSight 课程中的文档,并在线查找了更多信息。
我所拥有的看起来应该有用。我有我的 Subscribe 方法,它 returns 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 方法,但是我在这里设置的断点没有到达。
我的 Observable 已在 AutoFac 中注册为单例,并且我的 GraphQL 突变和查询有效,因此看起来 GraphQL 已正确设置并正常工作。在将 MyObject 添加到数据库后调用我的 observable 中的通知方法。
我查看了我的提交以使其正常工作,我认为我必须进行一些更改才能使订阅正常工作。
- 使用 I Subject 而不是创建 observable。这更方便,因为它包装了所需的可观察功能。
- 在 ReplaySubject 中将缓冲区大小设置为 1,以便立即发送消息。
- 升级到 GraphQL.Net V5。这与我创建的这个问题有关 https://github.com/graphql-dotnet/graphql-dotnet/issues/2494
- 将测试从 GraphiQL 切换到 Altair。 GraphiQL 似乎无法接收订阅,我不确定为什么,因为它确实触发了订阅,但从未收到消息。
我在 GitHub https://github.com/graphql-dotnet/graphql-dotnet/issues/2494 上有一个示例项目有效
我正在尝试使用 GraphQL .Net 在我的 GraphQL 服务器上设置订阅。我遵循了 QraphQL.Net 文档和 Roland Guijt 的 PluralSight 课程中的文档,并在线查找了更多信息。
我所拥有的看起来应该有用。我有我的 Subscribe 方法,它 returns 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 方法,但是我在这里设置的断点没有到达。
我的 Observable 已在 AutoFac 中注册为单例,并且我的 GraphQL 突变和查询有效,因此看起来 GraphQL 已正确设置并正常工作。在将 MyObject 添加到数据库后调用我的 observable 中的通知方法。
我查看了我的提交以使其正常工作,我认为我必须进行一些更改才能使订阅正常工作。
- 使用 I Subject 而不是创建 observable。这更方便,因为它包装了所需的可观察功能。
- 在 ReplaySubject 中将缓冲区大小设置为 1,以便立即发送消息。
- 升级到 GraphQL.Net V5。这与我创建的这个问题有关 https://github.com/graphql-dotnet/graphql-dotnet/issues/2494
- 将测试从 GraphiQL 切换到 Altair。 GraphiQL 似乎无法接收订阅,我不确定为什么,因为它确实触发了订阅,但从未收到消息。
我在 GitHub https://github.com/graphql-dotnet/graphql-dotnet/issues/2494 上有一个示例项目有效