@@ -11,65 +11,68 @@ namespace AgileConfig.Server.Common.EventBus
11
11
public class TinyEventBus : ITinyEventBus
12
12
{
13
13
private readonly IServiceCollection _serviceCollection ;
14
- private readonly static ConcurrentDictionary < Type , List < Type > > _eventHandlerMap = new ConcurrentDictionary < Type , List < Type > > ( ) ;
14
+ private static readonly ConcurrentDictionary < Type , List < Type > > EventHandlerMap = new ( ) ;
15
+ private IServiceProvider _localServiceProvider ;
16
+ private ILogger _logger ;
15
17
16
18
public TinyEventBus ( IServiceCollection serviceCollection )
17
19
{
18
- this . _serviceCollection = serviceCollection ;
20
+ _serviceCollection = serviceCollection ;
21
+ _logger = _serviceCollection . BuildServiceProvider ( ) . GetService < ILoggerFactory > ( ) . CreateLogger < TinyEventBus > ( ) ;
19
22
}
20
23
public void Register < T > ( ) where T : class , IEventHandler
21
24
{
22
25
var handlerType = typeof ( T ) ;
23
- var eventType = handlerType . GetInterfaces ( ) . FirstOrDefault ( x => x . IsGenericType ) . GenericTypeArguments . FirstOrDefault ( ) ;
24
- if ( _eventHandlerMap . TryGetValue ( eventType , out List < Type > handlerTypes ) )
26
+ var eventType = handlerType . GetInterfaces ( ) . FirstOrDefault ( x => x . IsGenericType ) ! . GenericTypeArguments . FirstOrDefault ( ) ;
27
+ if ( EventHandlerMap . TryGetValue ( eventType , out List < Type > handlerTypes ) )
25
28
{
26
29
handlerTypes . Add ( handlerType ) ;
27
30
}
28
31
else
29
32
{
30
- _eventHandlerMap . TryAdd ( eventType , new List < Type > {
33
+ EventHandlerMap . TryAdd ( eventType , new List < Type > {
31
34
handlerType
32
35
} ) ;
33
36
}
34
37
_serviceCollection . AddScoped < T > ( ) ;
35
38
36
39
}
37
40
41
+ /// <summary>
42
+ /// Trigger an event. This method must be called before the handler is registered.
43
+ /// </summary>
44
+ /// <typeparam name="TEvent"></typeparam>
45
+ /// <param name="evt"></param>
38
46
public void Fire < TEvent > ( TEvent evt ) where TEvent : IEvent
39
47
{
40
- var sp = _serviceCollection . BuildServiceProvider ( ) ;
41
- using var scope = sp . CreateScope ( ) ;
42
- var logger = scope . ServiceProvider . GetService < ILoggerFactory > ( ) . CreateLogger < TinyEventBus > ( ) ;
48
+ _localServiceProvider ??= _serviceCollection . BuildServiceProvider ( ) ;
43
49
44
- logger . LogInformation ( $ "Event fired: { typeof ( TEvent ) . Name } ") ;
50
+ _logger . LogInformation ( $ "Event fired: { typeof ( TEvent ) . Name } ") ;
45
51
46
52
var eventType = typeof ( TEvent ) ;
47
- if ( _eventHandlerMap . TryGetValue ( eventType , out List < Type > handlers ) )
53
+ if ( EventHandlerMap . TryGetValue ( eventType , out List < Type > handlers ) )
48
54
{
49
55
if ( handlers . Count == 0 )
50
56
{
51
- logger . LogInformation ( $ "Event fired: { typeof ( TEvent ) . Name } , but no handlers.") ;
57
+ _logger . LogInformation ( $ "Event fired: { typeof ( TEvent ) . Name } , but no handlers.") ;
52
58
return ;
53
59
}
54
60
55
61
foreach ( var handlerType in handlers )
56
62
{
57
63
_ = Task . Run ( async ( ) =>
58
64
{
59
- using var sc = sp . CreateScope ( ) ;
65
+ using var sc = _localServiceProvider . CreateScope ( ) ;
60
66
var handler = sc . ServiceProvider . GetService ( handlerType ) ;
61
- if ( handler != null )
67
+
68
+ try
62
69
{
63
- var handlerInstance = handler as IEventHandler ;
64
- try
65
- {
66
- await handlerInstance . Handle ( evt ) ;
67
- }
68
- catch ( Exception ex )
69
- {
70
- sc . ServiceProvider . GetService < ILoggerFactory > ( ) . CreateLogger < TinyEventBus > ( )
71
- . LogError ( ex , "try run {handler} occur error." , handlerType ) ;
72
- }
70
+ await ( handler as IEventHandler ) ? . Handle ( evt ) ! ;
71
+ }
72
+ catch ( Exception ex )
73
+ {
74
+ _logger
75
+ . LogError ( ex , "try run {handler} occur error." , handlerType ) ;
73
76
}
74
77
} ) ;
75
78
}
0 commit comments