/// <summary> /// 接收消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="hubConnectionBuilder">Hub连接建造者</param> /// <param name="onReceive">消息接收事件</param> public static void Receive <T>(HubConnectionBuilder hubConnectionBuilder, Action <T> onReceive) where T : IMessage { #region # 验证 if (!hubConnectionBuilder.HubConnectionBuilt) { throw new InvalidOperationException("Hub连接未构建,不可接收消息!"); } #endregion string hubName = MessageExtension.GetHubName <T>(); #region # 验证 if (!hubConnectionBuilder.ReceiverProxies.ContainsKey(hubName)) { throw new InvalidOperationException($"要接收的消息类型\"{typeof(T).Name}\"未注册!"); } #endregion IHubProxy proxy = hubConnectionBuilder.ReceiverProxies[hubName]; proxy.On <T>(CommonConstants.ExchangeMethodName, onReceive); }
/// <summary> /// 发送消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="hubConnectionBuilder">Hub连接建造者</param> /// <param name="message">消息</param> public static async Task SendAsync <T>(HubConnectionBuilder hubConnectionBuilder, T message) where T : IMessage { #region # 验证 if (!hubConnectionBuilder.HubConnectionBuilt) { throw new InvalidOperationException("Hub连接未构建,不可发送消息!"); } #endregion string hubName = MessageExtension.GetHubName <T>(); #region # 验证 if (!hubConnectionBuilder.SenderProxies.ContainsKey(hubName)) { throw new InvalidOperationException($"要发送的消息类型\"{typeof(T).Name}\"未注册!"); } #endregion IHubProxy proxy = hubConnectionBuilder.SenderProxies[hubName]; await proxy.Invoke(CommonConstants.ExchangeMethodName, message); //消息已发送事件 OnMessageSent?.Invoke(message); }
/// <summary> /// 注册接收消息类型 /// </summary> /// <param name="messageTypes">消息类型列表</param> public void RegisterMessagesToReceive(IEnumerable <Type> messageTypes) { #region # 验证 if (this.HubConnectionBuilt) { throw new InvalidOperationException("Hub连接已构建,不可注册接收消息类型!"); } #endregion messageTypes = messageTypes?.Distinct().ToArray() ?? new Type[0]; foreach (Type messageType in messageTypes) { #region # 验证 if (!typeof(IMessage).IsAssignableFrom(messageType)) { throw new InvalidOperationException($"类型\"{messageType.Name}\"未实现\"{nameof(IMessage)}\"接口!"); } #endregion string hubName = MessageExtension.GetHubName(messageType); IHubProxy hubProxy = this.HubConnection.CreateHubProxy(hubName); this._receiverProxies.Add(hubName, hubProxy); } }