Skip to content

Commit 05c468b

Browse files
author
agile.zhou
committed
Refactor the TinyEventBus
1 parent 12286f0 commit 05c468b

File tree

5 files changed

+50
-56
lines changed

5 files changed

+50
-56
lines changed

src/AgileConfig.Server.Common/EventBus/ITinyEventBus.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Threading.Tasks;
2-
using System;
32

43
namespace AgileConfig.Server.Common.EventBus
54
{

src/AgileConfig.Server.Common/EventBus/ServiceCollectionExt.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public static IServiceCollection AddTinyEventBus(this IServiceCollection sc)
88
{
99
sc.AddSingleton<ITinyEventBus, TinyEventBus>(sp =>
1010
new TinyEventBus(sc));
11+
1112
return sc;
1213
}
1314
}

src/AgileConfig.Server.Common/EventBus/TinyEventBus.cs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,65 +11,68 @@ namespace AgileConfig.Server.Common.EventBus
1111
public class TinyEventBus : ITinyEventBus
1212
{
1313
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;
1517

1618
public TinyEventBus(IServiceCollection serviceCollection)
1719
{
18-
this._serviceCollection = serviceCollection;
20+
_serviceCollection = serviceCollection;
21+
_logger = _serviceCollection.BuildServiceProvider().GetService<ILoggerFactory>().CreateLogger<TinyEventBus>();
1922
}
2023
public void Register<T>() where T : class, IEventHandler
2124
{
2225
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))
2528
{
2629
handlerTypes.Add(handlerType);
2730
}
2831
else
2932
{
30-
_eventHandlerMap.TryAdd(eventType, new List<Type> {
33+
EventHandlerMap.TryAdd(eventType, new List<Type> {
3134
handlerType
3235
});
3336
}
3437
_serviceCollection.AddScoped<T>();
3538

3639
}
3740

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>
3846
public void Fire<TEvent>(TEvent evt) where TEvent : IEvent
3947
{
40-
var sp = _serviceCollection.BuildServiceProvider();
41-
using var scope = sp.CreateScope();
42-
var logger = scope.ServiceProvider.GetService<ILoggerFactory>().CreateLogger<TinyEventBus>();
48+
_localServiceProvider ??= _serviceCollection.BuildServiceProvider();
4349

44-
logger.LogInformation($"Event fired: {typeof(TEvent).Name}");
50+
_logger.LogInformation($"Event fired: {typeof(TEvent).Name}");
4551

4652
var eventType = typeof(TEvent);
47-
if (_eventHandlerMap.TryGetValue(eventType, out List<Type> handlers))
53+
if (EventHandlerMap.TryGetValue(eventType, out List<Type> handlers))
4854
{
4955
if (handlers.Count == 0)
5056
{
51-
logger.LogInformation($"Event fired: {typeof(TEvent).Name}, but no handlers.");
57+
_logger.LogInformation($"Event fired: {typeof(TEvent).Name}, but no handlers.");
5258
return;
5359
}
5460

5561
foreach (var handlerType in handlers)
5662
{
5763
_ = Task.Run(async () =>
5864
{
59-
using var sc = sp.CreateScope();
65+
using var sc = _localServiceProvider.CreateScope();
6066
var handler = sc.ServiceProvider.GetService(handlerType);
61-
if (handler != null)
67+
68+
try
6269
{
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);
7376
}
7477
});
7578
}

src/AgileConfig.Server.Service/EventRegisterService/SystemEventHandlersRegister.cs

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,32 @@
44

55
namespace AgileConfig.Server.Service.EventRegisterService;
66

7-
public class SystemEventHandlersRegister : IEventHandlerRegister
7+
public class SystemEventHandlersRegister(ITinyEventBus tinyEventBus) : IEventHandlerRegister
88
{
9-
private readonly ITinyEventBus _tinyEventBus;
10-
11-
public SystemEventHandlersRegister(ITinyEventBus tinyEventBus)
12-
{
13-
_tinyEventBus = tinyEventBus;
14-
}
15-
169
public void Register()
1710
{
18-
_tinyEventBus.Register<LoginEventHandler>();
19-
_tinyEventBus.Register<InitSaPasswordEventHandler>();
20-
_tinyEventBus.Register<ResetUserPasswordEventHandler>();
21-
_tinyEventBus.Register<ChangeUserPasswordEventHandler>();
22-
_tinyEventBus.Register<AddAppEventHandler>();
23-
_tinyEventBus.Register<EditAppEventHandler>();
24-
_tinyEventBus.Register<DisableOrEnableAppEventHandler>();
25-
_tinyEventBus.Register<DeleteAppEventHandler>();
26-
_tinyEventBus.Register<AddConfigEventHandler>();
27-
_tinyEventBus.Register<EditConfigEventHandler>();
28-
_tinyEventBus.Register<DeleteConfigEventHandler>();
29-
_tinyEventBus.Register<DeleteSomeConfigEventHandler>();
30-
_tinyEventBus.Register<PublishConfigEventHandler>();
31-
_tinyEventBus.Register<RollbackConfigEventHandler>();
32-
_tinyEventBus.Register<DisContectClientEventHandler>();
33-
_tinyEventBus.Register<RegisterAServiceEventHandler>();
34-
_tinyEventBus.Register<UnRegisterAServiceEventHandler>();
35-
_tinyEventBus.Register<AddNodeEventHandler>();
36-
_tinyEventBus.Register<DeleteNodeEventHandler>();
37-
_tinyEventBus.Register<AddUserEventHandler>();
38-
_tinyEventBus.Register<EditUserEventHandler>();
39-
_tinyEventBus.Register<DeleteUserEventHandler>();
11+
tinyEventBus.Register<LoginEventHandler>();
12+
tinyEventBus.Register<InitSaPasswordEventHandler>();
13+
tinyEventBus.Register<ResetUserPasswordEventHandler>();
14+
tinyEventBus.Register<ChangeUserPasswordEventHandler>();
15+
tinyEventBus.Register<AddAppEventHandler>();
16+
tinyEventBus.Register<EditAppEventHandler>();
17+
tinyEventBus.Register<DisableOrEnableAppEventHandler>();
18+
tinyEventBus.Register<DeleteAppEventHandler>();
19+
tinyEventBus.Register<AddConfigEventHandler>();
20+
tinyEventBus.Register<EditConfigEventHandler>();
21+
tinyEventBus.Register<DeleteConfigEventHandler>();
22+
tinyEventBus.Register<DeleteSomeConfigEventHandler>();
23+
tinyEventBus.Register<PublishConfigEventHandler>();
24+
tinyEventBus.Register<RollbackConfigEventHandler>();
25+
tinyEventBus.Register<DisContectClientEventHandler>();
26+
tinyEventBus.Register<RegisterAServiceEventHandler>();
27+
tinyEventBus.Register<UnRegisterAServiceEventHandler>();
28+
tinyEventBus.Register<AddNodeEventHandler>();
29+
tinyEventBus.Register<DeleteNodeEventHandler>();
30+
tinyEventBus.Register<AddUserEventHandler>();
31+
tinyEventBus.Register<EditUserEventHandler>();
32+
tinyEventBus.Register<DeleteUserEventHandler>();
4033

4134
}
4235
}

test/AgileConfig.Server.ServiceTests/mysql/SysLogServiceTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
using System.Threading.Tasks;
55
using System;
66
using Testcontainers.MySql;
7-
using System.Data;
87
using AgileConfig.Server.Data.Entity;
9-
using Microsoft.Extensions.Configuration;
108

119
namespace AgileConfig.Server.ServiceTests.mysql
1210
{

0 commit comments

Comments
 (0)