9

我有一个服务应用程序,它的工作方式非常类似于 SignalR 背板,所以我认为创建自己的IMessageBus实现来与后端对话是个好主意,而不是推出我自己的东西。问题是我找不到关于这份合同的太多信息。虽然我一直在看代码(看起来非常好),但我很难理解一些概念。

public interface IMessageBus
{
    Task Publish(Message message);
    IDisposable Subscribe(ISubscriber subscriber, string cursor, Func<MessageResult, object, Task<bool>> callback, int maxMessages, object state);
}
  1. Task Publish(Message message);

这个很简单,基本上它必须向后端发送一条消息。我不担心这个,因为我的应用程序从服务器到客户端是单向的。

  1. IDisposable Subscribe(ISubscriber subscriber, string cursor, Func<MessageResult, object, Task<bool>> callback, int maxMessages, object state);

    • return: 尽管说了IDisposable,我看到它总是返回一个 Subscription 对象,但是为什么IDisposable呢?
    • subscriber标识一个连接。该连接可以订阅或取消订阅组。
    • cursor: 是最后收到的消息 ID。
    • callback: 这个回调什么时候执行?
    • state: 这究竟是什么?

有人可以解释一下这种方法是如何工作的吗?

4

1 回答 1

2

我建议从 ScaleoutMessageBus 继承(https://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.messaging.scaleoutmessagebus(v=vs.111).aspx

它提供了一个抽象并封装了所有订阅管理,因此可以专注于背板实现。

作为示例,您还可以查看 Redis 基本实现 ( https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Redis/RedisMessageBus.cs )。

如果有趣的话 SignalR 是开源的,那么您也可以查看 ScaleoutMessageBus 实现(https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Core/Messaging/ScaleoutMessageBus.cs )

希望有帮助。

于 2015-04-19T09:56:37.740 回答