/// <summary>
        /// Adds all sagas in the specified assemblies matching the namespace. If you are using both state machine and regular sagas, be
        /// sure to call AddSagaStateMachinesFromNamespaceContaining prior to calling this one.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="type">The type to use to identify the assembly and namespace to scan</param>
        /// <param name="filter"></param>
        public static void AddSagaStateMachinesFromNamespaceContaining(this ISimpleInjectorConfigurator configurator, Type type, Func <Type, bool> filter =
                                                                       null)
        {
            var registrar = new SimpleInjectorSagaStateMachineRegistrar(configurator.Container);

            configurator.AddSagaStateMachinesFromNamespaceContaining(registrar, type, filter);
        }
        /// <summary>
        /// Decorates the IPublishEndpoint and ISendEndpointProvider with a Transaction Outbox. Messages will not be
        /// released/sent until the ambient transaction is committed. This is only meant to be used outside of a consumer.
        /// If you want an outbox for Consumers, it is recommended to use the InMemoryOutbox.
        /// </summary>
        public static void AddTransactionOutbox(this ISimpleInjectorConfigurator builder)
        {
            builder.Container
            .RegisterSingleton(() =>
            {
                var busControl = builder.Container.GetInstance <IBusControl>();

                return(new TransactionOutbox(busControl, busControl, builder.Container.TryGetInstance <ILoggerFactory>()));
            });

            builder.Container
            .Register(() => (IPublishEndpoint)builder.Container.GetInstance <TransactionOutbox>(), Lifestyle.Singleton);

            builder.Container
            .Register(() => (ISendEndpointProvider)builder.Container.GetInstance <TransactionOutbox>(), Lifestyle.Singleton);
        }
        /// <summary>
        /// Adds SagaStateMachines to the registry, using the factory method, and updates the registrar prior to registering so that the default
        /// saga registrar isn't notified.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="types">The state machine types to add</param>
        public static void AddSagaStateMachines(this ISimpleInjectorConfigurator configurator, params Type[] types)
        {
            var registrar = new SimpleInjectorSagaStateMachineRegistrar(configurator.Container);

            configurator.AddSagaStateMachines(registrar, types);
        }
        /// <summary>
        /// Adds a SagaStateMachine to the registry, using the factory method, and updates the registrar prior to registering so that the default
        /// saga registrar isn't notified.
        /// </summary>
        /// <param name="configurator"></param>
        /// <typeparam name="TStateMachine"></typeparam>
        /// <typeparam name="TInstance"></typeparam>
        public static ISagaRegistrationConfigurator <TInstance> AddSagaStateMachine <TStateMachine, TInstance>(this ISimpleInjectorConfigurator configurator)
            where TStateMachine : class, SagaStateMachine <TInstance>
            where TInstance : class, SagaStateMachineInstance
        {
            var registrar = new SimpleInjectorSagaStateMachineRegistrar(configurator.Container);

            return(configurator.AddSagaStateMachine <TStateMachine, TInstance>(registrar));
        }