|
9 | 9 |
|
10 | 10 | namespace VirtoCommerce.Platform.Core.Bus
|
11 | 11 | {
|
12 |
| - public class InProcessBus : IEventPublisher, IHandlerRegistrar |
| 12 | + public class InProcessBus : IEventHandlerRegistrar, IEventPublisher, IHandlerRegistrar |
13 | 13 | {
|
14 | 14 | private readonly ILogger<InProcessBus> _logger;
|
15 |
| - private readonly Dictionary<Type, List<HandlerWrapper>> _handlersByType = new Dictionary<Type, List<HandlerWrapper>>(); |
| 15 | + private readonly List<HandlerWrapper> _handlers = []; |
16 | 16 |
|
17 | 17 | public InProcessBus(ILogger<InProcessBus> logger)
|
18 | 18 | {
|
19 | 19 | _logger = logger;
|
20 | 20 | }
|
21 | 21 |
|
22 |
| - public void RegisterHandler<T>(Func<T, CancellationToken, Task> handler) where T : class, IMessage |
| 22 | + public void RegisterEventHandler<T>(Func<T, Task> handler) |
| 23 | + where T : IEvent |
23 | 24 | {
|
24 |
| - if (!_handlersByType.TryGetValue(typeof(T), out var handlers)) |
| 25 | + var eventType = typeof(T); |
| 26 | + |
| 27 | + var handlerWrapper = new HandlerWrapper |
25 | 28 | {
|
26 |
| - handlers = new List<HandlerWrapper>(); |
27 |
| - _handlersByType.Add(typeof(T), handlers); |
28 |
| - } |
| 29 | + EventType = eventType, |
| 30 | + HandlerModuleName = handler.Target?.GetType().Module.Assembly.GetName().Name, |
| 31 | + Handler = (message, _) => handler((T)message), |
| 32 | + Logger = _logger |
| 33 | + }; |
| 34 | + |
| 35 | + _handlers.Add(handlerWrapper); |
| 36 | + } |
| 37 | + |
| 38 | + public void RegisterEventHandler<T>(Func<T, CancellationToken, Task> handler) |
| 39 | + where T : IEvent |
| 40 | + { |
| 41 | +#pragma warning disable VC0008 // Type or member is obsolete |
| 42 | + RegisterHandler(handler); |
| 43 | +#pragma warning restore VC0008 // Type or member is obsolete |
| 44 | + } |
| 45 | + |
| 46 | + [Obsolete("Use IApplicationBuilder.RegisterEventHandler<>()", DiagnosticId = "VC0008", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions")] |
| 47 | + public void RegisterHandler<T>(Func<T, CancellationToken, Task> handler) |
| 48 | + where T : IMessage |
| 49 | + { |
| 50 | + var eventType = typeof(T); |
29 | 51 |
|
30 | 52 | var handlerWrapper = new HandlerWrapper
|
31 | 53 | {
|
32 |
| - EventName = typeof(T).Name, |
33 |
| - HandlerModuleName = handler.Target.GetType().Module.Assembly.GetName().Name, |
| 54 | + EventType = eventType, |
| 55 | + HandlerModuleName = handler.Target?.GetType().Module.Assembly.GetName().Name, |
34 | 56 | Handler = (message, token) => handler((T)message, token),
|
35 | 57 | Logger = _logger
|
36 | 58 | };
|
37 | 59 |
|
38 |
| - handlers.Add(handlerWrapper); |
| 60 | + _handlers.Add(handlerWrapper); |
39 | 61 | }
|
40 | 62 |
|
41 |
| - public async Task Publish<T>(T @event, CancellationToken cancellationToken = default(CancellationToken)) where T : class, IEvent |
| 63 | + public async Task Publish<T>(T @event, CancellationToken cancellationToken = default) |
| 64 | + where T : IEvent |
42 | 65 | {
|
43 |
| - if (!EventSuppressor.EventsSuppressed && _handlersByType.TryGetValue(@event.GetType(), out var handlers)) |
| 66 | + if (EventSuppressor.EventsSuppressed) |
| 67 | + { |
| 68 | + return; |
| 69 | + } |
| 70 | + |
| 71 | + var eventType = @event.GetType(); |
| 72 | + |
| 73 | + var handlers = _handlers |
| 74 | + .Where(x => x.EventType.IsAssignableFrom(eventType)) |
| 75 | + .ToList(); |
| 76 | + |
| 77 | + if (handlers.Count > 0) |
44 | 78 | {
|
45 |
| - await Task.WhenAll(handlers.Select(handler => handler.Handle(@event, cancellationToken))); |
| 79 | + await Task.WhenAll(handlers.Select(x => x.Handle(@event, cancellationToken))); |
46 | 80 | }
|
47 | 81 | }
|
48 | 82 | }
|
|
0 commit comments