/// <summary>
        /// Initializes a new instance of the <see cref="MessageBusConfiguration"/> class.
        /// </summary>
        /// <param name="serviceProvider">The configured <see cref="IServiceProvider">service provider</see>.</param>
        /// <param name="clock">The configured <see cref="IClock">clock</see>.</param>
        /// <param name="persistence">The <see cref="IMapPersistence">mapping for persistence</see>.</param>
        /// <param name="messageSender">The configured <see cref="IMessageSender">message sender</see>.</param>
        /// <param name="messageReceiver">The configured <see cref="IMessageReceiver">message receiver</see>.</param>
        /// <param name="commandHandlerRegistrar">The configured <see cref="ICommandHandlerRegistrar">command handler registrar</see>.</param>
        /// <param name="eventReceiverRegistrar">The configured <see cref="IEventReceiverRegistrar">event handler registrar</see>.</param>
        /// <param name="sagaConfiguration">The <see cref="SagaConfiguration">saga configuration</see> used by the message bus.</param>
        /// <param name="uniqueIdGenerator">The configured <see cref="IUniqueIdGenerator">unique identifier generator</see> used by the message bus.</param>
        public MessageBusConfiguration(
            IServiceProvider serviceProvider,
            IClock clock,
            IMapPersistence persistence,
            IMessageSender messageSender,
            IMessageReceiver messageReceiver,
            ICommandHandlerRegistrar commandHandlerRegistrar,
            IEventReceiverRegistrar eventReceiverRegistrar,
            SagaConfiguration sagaConfiguration,
            IUniqueIdGenerator uniqueIdGenerator)
        {
            Arg.NotNull(serviceProvider, nameof(serviceProvider));
            Arg.NotNull(clock, nameof(clock));
            Arg.NotNull(persistence, nameof(persistence));
            Arg.NotNull(messageSender, nameof(messageSender));
            Arg.NotNull(messageReceiver, nameof(messageReceiver));
            Arg.NotNull(commandHandlerRegistrar, nameof(commandHandlerRegistrar));
            Arg.NotNull(eventReceiverRegistrar, nameof(eventReceiverRegistrar));
            Arg.NotNull(sagaConfiguration, nameof(sagaConfiguration));
            Arg.NotNull(uniqueIdGenerator, nameof(uniqueIdGenerator));

            this.serviceProvider = serviceProvider;
            Clock             = clock;
            Persistence       = persistence;
            MessageSender     = messageSender;
            MessageReceiver   = messageReceiver;
            CommandHandlers   = commandHandlerRegistrar;
            EventReceivers    = eventReceiverRegistrar;
            Sagas             = sagaConfiguration;
            UniqueIdGenerator = uniqueIdGenerator;
        }
        /// <summary>
        /// Indicates the message bus configuration will have the specified event receiver registrar.
        /// </summary>
        /// <param name="value">The configured <see cref="IEventReceiverRegistrar">event registrar</see>.</param>
        /// <returns>The original <see cref="MessageBusConfigurationBuilder"/> instance.</returns>
        public virtual MessageBusConfigurationBuilder HasEventReceiverRegistrar(IEventReceiverRegistrar value)
        {
            Arg.NotNull(value, nameof(value));
            Contract.Ensures(Contract.Result <MessageBusConfiguration>() != null);

            EventRegistrar = value;
            EventReceiverRegistrarIsOverriden = true;
            return(this);
        }