EventBridgeServiceCollectionExtensions.cs
3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using NCC;
using NCC.Dependency;
using NCC.EventBridge;
using NCC.Reflection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using System;
using System.Linq;
namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// 事件总线服务拓展
/// </summary>
[SuppressSniffer]
public static class EventBridgeServiceCollectionExtensions
{
/// <summary>
/// 添加事件总线服务
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddEventBridge(this IServiceCollection services)
{
return services.AddEventBridge<MemoryEventStoreProvider>();
}
/// <summary>
/// 添加事件总线服务
/// </summary>
/// <typeparam name="TEventStoreProvider"></typeparam>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddEventBridge<TEventStoreProvider>(this IServiceCollection services)
where TEventStoreProvider : class, IEventStoreProvider
{
// 查找所有事件处理程序
var eventHandlerTypes = App.EffectiveTypes.Where(u => u.IsClass && !u.IsInterface && !u.IsAbstract && typeof(IEventHandler).IsAssignableFrom(u));
if (!eventHandlerTypes.Any()) return services;
// 注册事件存储提供器
services.AddTransient<IEventStoreProvider, TEventStoreProvider>();
using var serviceProvider = InternalApp.InternalServices.BuildServiceProvider();
// 批量注册
foreach (var type in eventHandlerTypes)
{
// 注册事件处理程序
services.AddTransient(type);
services.AddTransient(typeof(IEventHandler), type);
// 触发事件存储提供器 [注册事件] 接口方法
var eventStoreProvider = serviceProvider.GetService<IEventStoreProvider>();
eventStoreProvider.RegisterEventHandlerAsync(new EventHandlerMetadata
{
AssemblyName = Reflect.GetAssemblyName(type),
Category = Event.GetEventHandlerCategory(type),
TypeFullName = type.FullName,
CreatedTime = DateTimeOffset.UtcNow
}).GetAwaiter().GetResult();
}
// 注册事件处理程序委托
services.TryAddTransient(provider =>
{
IEventHandler eventHandlerResolve(EventMessageMetadata eventIdMetadata)
{
// 加载类型程序集
var eventHandlerType = Reflect.GetType(eventIdMetadata.AssemblyName, eventIdMetadata.TypeFullName);
return provider.GetService(eventHandlerType) as IEventHandler;
}
return (Func<EventMessageMetadata, IEventHandler>)eventHandlerResolve;
});
return services;
}
}
}