using Infrastructure.Extensions; using Microsoft.Extensions.DependencyInjection; using System; using System.Linq; using System.Threading.Tasks; namespace Infrastructure.Events { public class EventPublisher : IEventPublisher { private readonly IServiceProvider _applicationServices; public EventPublisher(IServiceProvider applicationServices) { this._applicationServices = applicationServices; } public virtual void Publish(T eventMessage) { Task.Run(() => { using var scope = _applicationServices.CreateScope(); var subscribers = scope.ServiceProvider.GetServices(typeof(IEventHander<>).MakeGenericType(eventMessage.GetType())).ToList(); subscribers.ForEach(subscriber => { try { subscriber.GetType().GetMethod("Handle", new Type[] { eventMessage.GetType() }).Invoke(subscriber, new object[] { eventMessage }); } catch (Exception ex) { ex.PrintStack(); } }); }); } } }