Exemplo n.º 1
0
        /// <summary> 执行事务 </summary>
        /// <param name="manager"></param>
        /// <param name="eventName"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static async Task ProcessEvent(this ISubscribeManager manager, string eventName, byte[] data)
        {
            var codec = CurrentIocManager.Resolve <IMessageCodec>();

            if (manager.HasSubscriptionsForEvent(eventName))
            {
                var eventType = manager.GetEventTypeByName(eventName);
                var @event    = codec.Decode(data, eventType);
                var handlers  = manager.GetHandlersForEvent(eventName);

                foreach (var handlerfactory in handlers)
                {
                    var handler      = handlerfactory.DynamicInvoke();
                    var concreteType = typeof(IEventHandler <>).MakeGenericType(eventType);
                    var method       = concreteType.GetMethod("Handle");
                    if (method == null)
                    {
                        continue;
                    }
                    await(Task) method.Invoke(handler, new[] { @event });
                }
            }
        }