using System;
using System.Threading.Tasks;
using Abp.Events.Bus.Factories;
using Abp.Events.Bus.Handlers;
namespace Abp.Events.Bus
{
///
/// Defines interface of the event bus.
///
public interface IEventBus
{
#region Register
///
/// Registers to an event.
/// Given action is called for all event occurrences.
///
/// Action to handle events
/// Event type
IDisposable Register(Action action) where TEventData : IEventData;
///
/// Registers to an event.
/// Given action is called for all event occurrences.
///
/// Action to handle events
/// Event type
IDisposable AsyncRegister(Func action) where TEventData : IEventData;
///
/// Registers to an event.
/// Same (given) instance of the handler is used for all event occurrences.
///
/// Event type
/// Object to handle the event
IDisposable Register(IEventHandler handler) where TEventData : IEventData;
///
/// Registers to an event.
/// Same (given) instance of the async handler is used for all event occurrences.
///
/// Event type
/// Object to handle the event
IDisposable AsyncRegister(IAsyncEventHandler handler) where TEventData : IEventData;
///
/// Registers to an event.
/// A new instance of object is created for every event occurrence.
///
/// Event type
/// Type of the event handler
IDisposable Register() where TEventData : IEventData where THandler : IEventHandler, new();
///
/// Registers to an event.
/// Same (given) instance of the handler is used for all event occurrences.
///
/// Event type
/// Object to handle the event
IDisposable Register(Type eventType, IEventHandler handler);
///
/// Registers to an event.
/// Given factory is used to create/release handlers
///
/// Event type
/// A factory to create/release handlers
IDisposable Register(IEventHandlerFactory factory) where TEventData : IEventData;
///
/// Registers to an event.
///
/// Event type
/// A factory to create/release handlers
IDisposable Register(Type eventType, IEventHandlerFactory factory);
#endregion
#region Unregister
///
/// Unregisters from an event.
///
/// Event type
///
void Unregister(Action action) where TEventData : IEventData;
///
/// Unregisters from an event.
///
/// Event type
///
void AsyncUnregister(Func action) where TEventData : IEventData;
///
/// Unregisters from an event.
///
/// Event type
/// Handler object that is registered before
void Unregister(IEventHandler handler) where TEventData : IEventData;
///
/// Unregisters from an event.
///
/// Event type
/// Handler object that is registered before
void AsyncUnregister(IAsyncEventHandler handler) where TEventData : IEventData;
///
/// Unregisters from an event.
///
/// Event type
/// Handler object that is registered before
void Unregister(Type eventType, IEventHandler handler);
///
/// Unregisters from an event.
///
/// Event type
/// Factory object that is registered before
void Unregister(IEventHandlerFactory factory) where TEventData : IEventData;
///
/// Unregisters from an event.
///
/// Event type
/// Factory object that is registered before
void Unregister(Type eventType, IEventHandlerFactory factory);
///
/// Unregisters all event handlers of given event type.
///
/// Event type
void UnregisterAll() where TEventData : IEventData;
///
/// Unregisters all event handlers of given event type.
///
/// Event type
void UnregisterAll(Type eventType);
#endregion
#region Trigger
///
/// Triggers an event.
///
/// Event type
/// Related data for the event
void Trigger(TEventData eventData) where TEventData : IEventData;
///
/// Triggers an event.
///
/// Event type
/// The object which triggers the event
/// Related data for the event
void Trigger(object eventSource, TEventData eventData) where TEventData : IEventData;
///
/// Triggers an event.
///
/// Event type
/// Related data for the event
void Trigger(Type eventType, IEventData eventData);
///
/// Triggers an event.
///
/// Event type
/// The object which triggers the event
/// Related data for the event
void Trigger(Type eventType, object eventSource, IEventData eventData);
///
/// Triggers an event asynchronously.
///
/// Event type
/// Related data for the event
/// The task to handle async operation
Task TriggerAsync(TEventData eventData) where TEventData : IEventData;
///
/// Triggers an event asynchronously.
///
/// Event type
/// The object which triggers the event
/// Related data for the event
/// The task to handle async operation
Task TriggerAsync(object eventSource, TEventData eventData) where TEventData : IEventData;
///
/// Triggers an event asynchronously.
///
/// Event type
/// Related data for the event
/// The task to handle async operation
Task TriggerAsync(Type eventType, IEventData eventData);
///
/// Triggers an event asynchronously.
///
/// Event type
/// The object which triggers the event
/// Related data for the event
/// The task to handle async operation
Task TriggerAsync(Type eventType, object eventSource, IEventData eventData);
#endregion
}
}