using NzbDrone.Common.Messaging.Tracking;

namespace NzbDrone.Common.Messaging
{
    /// <summary>
    ///   Enables loosely-coupled publication of events.
    /// </summary>
    public interface IMessageAggregator
    {
        void PublishEvent<TEvent>(TEvent @event) where TEvent : class,  IEvent;
        void PublishCommand<TCommand>(TCommand command) where TCommand : class, ICommand;
        void PublishCommand(string commandTypeName);
        TrackedCommand PublishCommandAsync<TCommand>(TCommand command) where TCommand : class, ICommand;
        TrackedCommand PublishCommandAsync(string commandTypeName);
    }
}