/// <summary> /// 发布事件 /// </summary> /// <typeparam name="TSender"></typeparam> /// <typeparam name="TEventArgs"></typeparam> /// <param name="sender"></param> /// <param name="eventArgs"></param> /// <returns></returns> public async Task <bool> PublishAsync <TSender, TEventArgs>(TSender sender, TEventArgs eventArgs) where TEventArgs : CommonEventArgs { string eventKey = GetEventKey <TSender, TEventArgs>(); if (!handlers.ContainsKey(eventKey)) { return(false); } var handlerTypes = handlers[eventKey]; foreach (Type handlerType in handlerTypes) { var handler = ServiceLocator.GetService <IEventHandler <TSender, TEventArgs> >(handlerType); if (null != handler) { await handler.HandleAsync(sender, eventArgs).ContinueWith(task => { task.Exception?.Handle(exception => { LoggerLocator.GetLogger <LocalEventBus>().LogError(exception, "执行触发操作事件时发生异常"); return(true); }); }).ConfigureAwait(false); } } return(true); }
/// <summary> /// 订阅事件 /// </summary> /// <typeparam name="TEventArgs"></typeparam> /// <typeparam name="TEventHandler"></typeparam> public void Subscribe <TSender, TEventArgs, TEventHandler>() where TEventArgs : CommonEventArgs where TEventHandler : IEventHandler <TSender, TEventArgs> { AddSubscriptionAsync <TSender, TEventArgs, TEventHandler>().Wait(); var channelName = GetChannelName <TSender, TEventArgs>(typeof(TEventHandler).FullName); redisClient.Db0.SubscribeAsync <RedisEventMessgae <TSender, TEventArgs> >(channelName, async(message) => { var handler = ServiceLocator.GetService <TEventHandler>(); if (handler != null && message != null) { await handler.HandleAsync(message.Sender, message.EventArgs).ContinueWith(task => { task.Exception?.Handle(exception => { LoggerLocator.GetLogger <RedisEventBus>().LogError(exception, "执行触发操作事件时发生异常"); return(true); }); }).ConfigureAwait(false); } }); }