Try your search with a different keyword or use * as a wildcard.
using Nop.Core.Events;
using Nop.Core.Infrastructure;
using Nop.Services.Logging;
namespace Nop.Services.Events;
/// <summary>
/// Represents the event publisher implementation
/// </summary>
public partial class EventPublisher : IEventPublisher
{
#region Methods
/// <summary>
/// Publish event to consumers
/// </summary>
/// <typeparam name="TEvent">Type of event</typeparam>
/// <param name="event">Event object</param>
/// <returns>A task that represents the asynchronous operation</returns>
public virtual async Task PublishAsync<TEvent>(TEvent @event)
{
//get all event consumers
var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();
foreach (var consumer in consumers)
try
{
//try to handle published event
await consumer.HandleEventAsync(@event);
if (@event is IStopProcessingEvent { StopProcessing: true })
break;
}
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<ILogger>();
if (logger == null)
return;
await logger.ErrorAsync(exception.Message, exception);
}
catch
{
// ignored
}
}
}
/// <summary>
/// Publish event to consumers
/// </summary>
/// <typeparam name="TEvent">Type of event</typeparam>
/// <param name="event">Event object</param>
public virtual void Publish<TEvent>(TEvent @event)
{
//get all event consumers
var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();
foreach (var consumer in consumers)
try
{
//try to handle published event
consumer.HandleEventAsync(@event).Wait();
if (@event is IStopProcessingEvent { StopProcessing: true })
break;
}
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<ILogger>();
if (logger == null)
return;
logger.Error(exception.Message, exception);
}
catch
{
// ignored
}
}
}
#endregion
}