using Nop.Core.Events; using Nop.Core.Infrastructure; using Nop.Services.Logging; namespace Nop.Services.Events; /// /// Represents the event publisher implementation /// public partial class EventPublisher : IEventPublisher { #region Methods /// /// Publish event to consumers /// /// Type of event /// Event object /// A task that represents the asynchronous operation public virtual async Task PublishAsync(TEvent @event) { //get all event consumers var consumers = EngineContext.Current.ResolveAll>().ToList(); foreach (var consumer in consumers) { try { //try to handle published event await consumer.HandleEventAsync(@event); } catch (Exception exception) { //log error, we put in to nested try-catch to prevent possible cyclic (if some error occurs) try { var logger = EngineContext.Current.Resolve(); if (logger == null) return; await logger.ErrorAsync(exception.Message, exception); } catch { // ignored } } } } /// /// Publish event to consumers /// /// Type of event /// Event object public virtual void Publish(TEvent @event) { //get all event consumers var consumers = EngineContext.Current.ResolveAll>().ToList(); foreach (var consumer in consumers) try { //try to handle published event consumer.HandleEventAsync(@event).Wait(); } catch (Exception exception) { //log error, we put in to nested try-catch to prevent possible cyclic (if some error occurs) try { var logger = EngineContext.Current.Resolve(); if (logger == null) return; logger.Error(exception.Message, exception); } catch { // ignored } } } #endregion }