Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
                }
            });
        }