Browse Source

Get handler types safely and change anon conversion

Add GetHandlerType(IEventHandlerFactory) to determine handler Type from known factory implementations (SingleInstance, Ioc, Transient) instead of instantiating handlers. Update LocalEventBus to use this helper when reading LocalEventHandlerOrderAttribute to avoid unnecessary handler creation/disposal. Also switch DistEventScenarioRunner to use AnonymousEventDataConverter.ConvertToLooseObject(...) for anonymous event payload conversion.
pull/25023/head
SALİH ÖZKARA 3 weeks ago
parent
commit
318c40a0ee
  1. 32
      framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs
  2. 2
      test/DistEvents/DistDemoApp.Shared/DistEventScenarioRunner.cs

32
framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Local/LocalEventBus.cs

@ -231,11 +231,11 @@ public class LocalEventBus : EventBusBase, ILocalEventBus, ISingletonDependency
{
foreach (var factory in handlerFactory.Value)
{
using var handler = factory.GetHandler();
var handlerType = GetHandlerType(factory);
handlerFactoryList.Add(new Tuple<IEventHandlerFactory, Type, int>(
factory,
handlerFactory.Key,
ReflectionHelper.GetAttributesOfMemberOrDeclaringType<LocalEventHandlerOrderAttribute>(handler.EventHandler.GetType()).FirstOrDefault()?.Order ?? 0));
ReflectionHelper.GetAttributesOfMemberOrDeclaringType<LocalEventHandlerOrderAttribute>(handlerType).FirstOrDefault()?.Order ?? 0));
}
}
@ -243,11 +243,11 @@ public class LocalEventBus : EventBusBase, ILocalEventBus, ISingletonDependency
{
foreach (var factory in handlerFactory.Value)
{
using var handler = factory.GetHandler();
var handlerType = GetHandlerType(factory);
handlerFactoryList.Add(new Tuple<IEventHandlerFactory, Type, int>(
factory,
typeof(AnonymousEventData),
ReflectionHelper.GetAttributesOfMemberOrDeclaringType<LocalEventHandlerOrderAttribute>(handler.EventHandler.GetType()).FirstOrDefault()?.Order ?? 0));
ReflectionHelper.GetAttributesOfMemberOrDeclaringType<LocalEventHandlerOrderAttribute>(handlerType).FirstOrDefault()?.Order ?? 0));
}
}
@ -268,8 +268,7 @@ public class LocalEventBus : EventBusBase, ILocalEventBus, ISingletonDependency
{
foreach (var factory in handlerFactory.Value)
{
using var handler = factory.GetHandler();
var handlerType = handler.EventHandler.GetType();
var handlerType = GetHandlerType(factory);
handlerFactoryList.Add(new Tuple<IEventHandlerFactory, Type, int>(
factory,
typeof(AnonymousEventData),
@ -330,6 +329,27 @@ public class LocalEventBus : EventBusBase, ILocalEventBus, ISingletonDependency
return PublishAsync(typeof(AnonymousEventData), anonymousEventData, onUnitOfWorkComplete);
}
private static Type GetHandlerType(IEventHandlerFactory factory)
{
if (factory is SingleInstanceHandlerFactory singleInstanceHandlerFactory)
{
return singleInstanceHandlerFactory.HandlerInstance.GetType();
}
if (factory is IocEventHandlerFactory iocEventHandlerFactory)
{
return iocEventHandlerFactory.HandlerType;
}
if (factory is TransientEventHandlerFactory transientEventHandlerFactory)
{
return transientEventHandlerFactory.HandlerType;
}
using var handler = factory.GetHandler();
return handler.EventHandler.GetType();
}
private bool HasAnonymousHandlers(string eventName)
{
if (!AnonymousEventHandlerFactories.TryGetValue(eventName, out var handlerFactories))

2
test/DistEvents/DistDemoApp.Shared/DistEventScenarioRunner.cs

@ -58,7 +58,7 @@ public class DistEventScenarioRunner : IDistEventScenarioRunner, ITransientDepen
new SingleInstanceHandlerFactory(
new ActionEventHandler<AnonymousEventData>(eventData =>
{
var converted = eventData.ConvertToTypedObject();
var converted = AnonymousEventDataConverter.ConvertToLooseObject(eventData);
if (converted is Dictionary<string, object> payload &&
payload.TryGetValue("Message", out var message) &&
message?.ToString() == profile.AnonymousOnlyMessage)

Loading…
Cancel
Save