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 { /// /// 事件总线服务拓展 /// [SuppressSniffer] public static class EventBridgeServiceCollectionExtensions { /// /// 添加事件总线服务 /// /// /// public static IServiceCollection AddEventBridge(this IServiceCollection services) { return services.AddEventBridge(); } /// /// 添加事件总线服务 /// /// /// /// public static IServiceCollection AddEventBridge(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(); using var serviceProvider = InternalApp.InternalServices.BuildServiceProvider(); // 批量注册 foreach (var type in eventHandlerTypes) { // 注册事件处理程序 services.AddTransient(type); services.AddTransient(typeof(IEventHandler), type); // 触发事件存储提供器 [注册事件] 接口方法 var eventStoreProvider = serviceProvider.GetService(); 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)eventHandlerResolve; }); return services; } } }