EventBusInstaller.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.Reflection;
  2. using Abp.Configuration.Startup;
  3. using Abp.Dependency;
  4. using Abp.Events.Bus.Factories;
  5. using Abp.Events.Bus.Handlers;
  6. using Castle.MicroKernel;
  7. using Castle.MicroKernel.Registration;
  8. using Castle.MicroKernel.SubSystems.Configuration;
  9. using Castle.Windsor;
  10. namespace Abp.Events.Bus
  11. {
  12. /// <summary>
  13. /// Installs event bus system and registers all handlers automatically.
  14. /// </summary>
  15. internal class EventBusInstaller : IWindsorInstaller
  16. {
  17. private readonly IIocResolver _iocResolver;
  18. private readonly IEventBusConfiguration _eventBusConfiguration;
  19. private IEventBus _eventBus;
  20. public EventBusInstaller(IIocResolver iocResolver)
  21. {
  22. _iocResolver = iocResolver;
  23. _eventBusConfiguration = iocResolver.Resolve<IEventBusConfiguration>();
  24. }
  25. public void Install(IWindsorContainer container, IConfigurationStore store)
  26. {
  27. if (_eventBusConfiguration.UseDefaultEventBus)
  28. {
  29. container.Register(
  30. Component.For<IEventBus>().Instance(EventBus.Default).LifestyleSingleton()
  31. );
  32. }
  33. else
  34. {
  35. container.Register(
  36. Component.For<IEventBus>().ImplementedBy<EventBus>().LifestyleSingleton()
  37. );
  38. }
  39. _eventBus = container.Resolve<IEventBus>();
  40. container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
  41. }
  42. private void Kernel_ComponentRegistered(string key, IHandler handler)
  43. {
  44. /* This code checks if registering component implements any IEventHandler<TEventData> interface, if yes,
  45. * gets all event handler interfaces and registers type to Event Bus for each handling event.
  46. */
  47. if (!typeof(IEventHandler).GetTypeInfo().IsAssignableFrom(handler.ComponentModel.Implementation))
  48. {
  49. return;
  50. }
  51. var interfaces = handler.ComponentModel.Implementation.GetTypeInfo().GetInterfaces();
  52. foreach (var @interface in interfaces)
  53. {
  54. if (!typeof(IEventHandler).GetTypeInfo().IsAssignableFrom(@interface))
  55. {
  56. continue;
  57. }
  58. var genericArgs = @interface.GetGenericArguments();
  59. if (genericArgs.Length == 1)
  60. {
  61. _eventBus.Register(genericArgs[0], new IocHandlerFactory(_iocResolver, handler.ComponentModel.Implementation));
  62. }
  63. }
  64. }
  65. }
  66. }