/// <summary>
 /// Overloaded constructor to bring up form upon entering the baseURL
 /// </summary>
 /// <param name="driver"></param>
 /// <param name="registrationType"></param>
 public FiveKRegistrationForm(IWebDriver driver, RegistrationTypes registrationType) :
     base(driver)
 {
     this.NavigateToBaseURL();
     this.SelectRegistrationType(registrationType);
     Thread.Sleep(3000); // Wait for form to render.
 }
        /// <inheritdoc />
        public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType,
                                                     string connection, string queue)
        {
            var myType   = Assembly.GetAssembly(GetType());
            var baseType = Assembly.GetAssembly(typeof(IDbFactory));

            base.RegisterImplementations(container, registrationType, connection, queue, myType, baseType);

            container.Register <IDbDataSource, DbDataSource>(LifeStyles.Singleton);
            container.Register <IGetFileNameFromConnectionString, GetFileNameFromConnectionString>(LifeStyles.Singleton);
            container.Register <IDbFactory, DbFactory>(LifeStyles.Singleton);
            container.Register <IReaderAsync, ReaderAsync>(LifeStyles.Singleton);
            container.Register <DatabaseExists>(LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateJobTablesCommand <ITable>, QueueCreationResult>),
                typeof(CreateJobTablesCommandDecorator), LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateQueueTablesAndSaveConfigurationCommand <ITable>,
                                                  QueueCreationResult>),
                typeof(CreateQueueTablesAndSaveConfigurationDecorator), LifeStyles.Singleton);
        }
Пример #3
0
            public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, QueueConnection queueConnection)
            {
                container.Register <IConnectionInformation>(() => new BaseConnectionInformation(queueConnection), LifeStyles.Singleton);
                container.Register <ISendMessages, SendMessagesNoOp>(LifeStyles.Singleton);
                container.Register <IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTimeNoOp>(LifeStyles.Singleton);

                container.Register(() => Substitute.For <ICorrelationIdFactory>(),
                                   LifeStyles.Singleton);
                container.Register(
                    () => Substitute.For <IReceiveMessagesFactory>(), LifeStyles.Singleton);

                container.Register(
                    () => Substitute.For <IJobSchedulerLastKnownEvent>(), LifeStyles.Singleton);

                container.Register(
                    () => Substitute.For <ISendJobToQueue>(), LifeStyles.Singleton);

                container.Register(
                    () => Substitute.For <IJobTableCreation>(), LifeStyles.Singleton);

                container.Register <ATaskScheduler, TaskSchedulerNoOp>(LifeStyles.Singleton);
                container.Register <IClearExpiredMessages, ClearExpiredMessagesNoOp>(LifeStyles.Singleton);
                container.Register <IClearErrorMessages, ClearErrorMessagesNoOp>(LifeStyles.Singleton);
                container.Register <ISendHeartBeat, SendHeartBeatNoOp>(LifeStyles.Singleton);
                container.Register <IReceiveMessagesError, ReceiveMessagesErrorNoOp>(LifeStyles.Singleton);
                container.Register <IReceivePoisonMessage, ReceivePoisonMessageNoOp>(LifeStyles.Singleton);
                container.Register <IResetHeartBeat, ResetHeartBeatNoOp>(LifeStyles.Singleton);
            }
Пример #4
0
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the connection.</param>
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {
            var options              = container.GetInstance <RedisQueueTransportOptions>();
            var configurationSend    = container.GetInstance <QueueProducerConfiguration>();
            var configurationReceive = container.GetInstance <QueueConsumerConfiguration>();

            configurationSend.AdditionalConfiguration.SetSetting("RedisQueueTransportOptions", options);
            configurationReceive.AdditionalConfiguration.SetSetting("RedisQueueTransportOptions", options);

            var transportReceive = container.GetInstance <TransportConfigurationReceive>();

            transportReceive.HeartBeatSupported         = true;
            transportReceive.MessageExpirationSupported = true;
            transportReceive.MessageRollbackSupported   = true;

            transportReceive.QueueDelayBehavior.Clear();
            transportReceive.QueueDelayBehavior.Add(DefaultQueueDelay());
            transportReceive.FatalExceptionDelayBehavior.Clear();
            transportReceive.FatalExceptionDelayBehavior.Add(ExceptionDelay());

            options.TimeServer = TimeLocations.RedisServer;

            transportReceive.LockFeatures();

            SetupHeartBeat(container);
            SetupMessageExpiration(container);

            //only compile scripts if the container is not in verification mode
            if (!container.IsVerifying)
            {
                SetupScripts(container);
            }
        }
Пример #5
0
        /// <summary>
        /// Suppress warnings for specific cases.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void SuppressWarningsIfNeeded(IContainer container, RegistrationTypes registrationType)
        {
            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive)
            {
                container.SuppressDiagnosticWarning(typeof(IMessageContext),
                                                    DiagnosticTypes.DisposableTransientComponent,
                                                    "IMessageContext is explicitly disposed of via a using statement");

                container.SuppressDiagnosticWarning(typeof(MessageContext),
                                                    DiagnosticTypes.DisposableTransientComponent,
                                                    "MessageContext is explicitly disposed of via a using statement");

                container.SuppressDiagnosticWarning(typeof(ATaskScheduler),
                                                    DiagnosticTypes.DisposableTransientComponent,
                                                    "ATaskScheduler is disposed of via its parent queue if created by this library. Otherwise, the caller of this library is responsible for disposing the task scheduler");

                container.SuppressDiagnosticWarning(typeof(IWorker),
                                                    DiagnosticTypes.DisposableTransientComponent,
                                                    "IWorker is disposed of via the worker collection");

                container.SuppressDiagnosticWarning(typeof(IPrimaryWorker),
                                                    DiagnosticTypes.DisposableTransientComponent,
                                                    "IPrimaryWorker is disposed of via the queue");
            }
        }
Пример #6
0
        /// <inheritdoc />
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {
            var init = new RelationalDatabaseMessageQueueInit <long, Guid>();

            init.SetDefaultsIfNeeded(container, "PostgreSQLMessageQueueTransportOptions", "PostgreSQLMessageQueueTransportOptions");
            SetupPolicy(container);
        }
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the connection.</param>
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType,
                                                 ConnectionTypes connectionType)
        {
            var init = new RelationalDatabaseMessageQueueInit <long, Guid>();

            init.SetDefaultsIfNeeded(container, "SQLiteMessageQueueTransportOptions",
                                     "SQLiteMessageQueueTransportOptions");

            SetupPolicy(container);

            //create in memory hold
            var getFileName = container.GetInstance <IGetFileNameFromConnectionString>();
            var connection  = container.GetInstance <IConnectionInformation>();
            var fileName    = getFileName.GetFileName(connection.ConnectionString);

            if (!fileName.IsInMemory)
            {
                return;
            }
            var scope  = container.GetInstance <ICreationScope>();
            var holder = new SqLiteHoldConnection(getFileName, container.GetInstance <IDbFactory>());

            holder.AddConnectionIfNeeded(connection);
            scope.AddScopedObject(holder);
        }
Пример #8
0
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="connection">The connection.</param>
 /// <param name="queue">The queue.</param>
 public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, string connection, string queue)
 {
     container.Register<IConnectionInformation>(() => new BaseConnectionInformation(queue, connection),
         LifeStyles.Singleton);
     container.Register<IInternalSerializer, JsonSerializerInternal>(LifeStyles.Singleton);
     container.Register<IWorkerNotificationFactory, WorkerNotificationFactoryNoOp>(LifeStyles.Singleton);
 }
        /// <inheritdoc />
        public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType,
                                                     QueueConnection queueConnection)
        {
            var myType   = Assembly.GetAssembly(GetType());
            var baseType = Assembly.GetAssembly(typeof(IDbFactory));

            base.RegisterImplementations(container, registrationType, queueConnection, myType, baseType);

            container.Register <IDbDataSource, DbDataSource>(LifeStyles.Singleton);
            container.Register <IGetFileNameFromConnectionString, GetFileNameFromConnectionString>(LifeStyles.Singleton);
            container.Register <IDbFactory, DbFactory>(LifeStyles.Singleton);
            container.Register <IReaderAsync, ReaderAsync>(LifeStyles.Singleton);
            container.Register <DatabaseExists>(LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateJobTablesCommand <ITable>, QueueCreationResult>),
                typeof(CreateJobTablesCommandDecorator), LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateQueueTablesAndSaveConfigurationCommand <ITable>,
                                                  QueueCreationResult>),
                typeof(CreateQueueTablesAndSaveConfigurationDecorator), LifeStyles.Singleton);

            //some SQLite errors should be warnings, not errors
            container.RegisterDecorator(
                typeof(IQueryHandler <FindMessagesToResetByHeartBeatQuery <long>, IEnumerable <MessageToReset <long> > >),
                typeof(FindRecordsToResetByHeartBeatErrorDecorator), LifeStyles.Singleton);

            //some SQLite errors should be warnings, not errors
            container.RegisterDecorator(
                typeof(IQueryHandler <FindExpiredMessagesToDeleteQuery <long>, IEnumerable <long> >),
                typeof(FindExpiredRecordsToDeleteQueryHandlerErrorDecorator), LifeStyles.Singleton);
        }
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the connection.</param>
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {
            //create in memory hold
            var scope  = container.GetInstance <ICreationScope>();
            var holder = container.GetInstance <IDataStorage>();

            scope.AddScopedObject(holder);

            var factory              = container.GetInstance <ITransportOptionsFactory>();
            var options              = factory.Create();
            var configurationSend    = container.GetInstance <QueueProducerConfiguration>();
            var configurationReceive = container.GetInstance <QueueConsumerConfiguration>();

            configurationSend.AdditionalConfiguration.SetSetting("MemoryTransportOptions", options);
            configurationReceive.AdditionalConfiguration.SetSetting("MemoryTransportOptions", options);

            var transportReceive = container.GetInstance <TransportConfigurationReceive>();

            transportReceive.HeartBeatSupported         = false;
            transportReceive.MessageExpirationSupported = false;
            transportReceive.MessageRollbackSupported   = false;

            transportReceive.QueueDelayBehavior.Clear();
            transportReceive.QueueDelayBehavior.Add(GetQueueDelay());
            transportReceive.FatalExceptionDelayBehavior.Clear();

            transportReceive.LockFeatures();
        }
Пример #11
0
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="queueConnection">Queue and connection information.</param>
 public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, QueueConnection queueConnection)
 {
     container.Register <IConnectionInformation>(() => new BaseConnectionInformation(queueConnection), LifeStyles.Singleton);
     container.Register <IInternalSerializer, JsonSerializerInternal>(LifeStyles.Singleton);
     container.Register <IWorkerNotificationFactory, WorkerNotificationFactoryNoOp>(LifeStyles.Singleton);
     container.Register <IJobScheduler, JobScheduler>(LifeStyles.Singleton);
     container.Register <IJobQueue, JobQueue>(LifeStyles.Singleton);
 }
Пример #12
0
        /// <summary>
        /// Registers the implementations.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="queueConnection">Queue and connection information.</param>
        public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType,
                                                     QueueConnection queueConnection)
        {
            Guard.NotNull(() => container, container);

            container.RegisterNonScopedSingleton <ICreationScope>(new CreationScope());

            //**all
            container.Register <IJobTableCreation, JobTableCreation>(LifeStyles.Singleton);
            container.Register <CreateJobMetaData>(LifeStyles.Singleton);
            container.Register <ICorrelationIdFactory, CorrelationIdFactory>(LifeStyles.Singleton);
            container.Register <IClearExpiredMessages, ClearExpiredMessages>(LifeStyles.Singleton);
            container.Register <IClearErrorMessages, ClearErrorMessages>(LifeStyles.Singleton);
            container.Register <IDataStorage, DataStorage>(LifeStyles.Singleton);
            container.Register <IDataStorageSendMessage, DataStorage>(LifeStyles.Singleton);
            container.Register <IRemoveMessage, RemoveMessage>(LifeStyles.Singleton);
            container.Register <IGetHeader, GetHeader>(LifeStyles.Singleton);
            container.Register <IGetPreviousMessageErrors, GetPreviousMessageErrorsNoOp>(LifeStyles.Singleton);
            //**all

            //**send
            container.Register <ISendMessages, SendMessages>(LifeStyles.Singleton);
            //**send


            //**receive
            container.Register <IResetHeartBeat, ResetHeartBeat>(LifeStyles.Singleton);
            container.Register <ISendHeartBeat, SendHeartBeat>(LifeStyles.Singleton);
            container.Register <IReceiveMessagesFactory, ReceiveMessagesFactory>(LifeStyles.Singleton);
            container.Register <IReceivePoisonMessage, ReceivePoisonMessage>(LifeStyles.Singleton);
            container.Register <IReceiveMessagesError, ReceiveErrorMessage>(LifeStyles.Singleton);
            //**receive

            //**all
            container.RegisterNonScopedSingleton <ICreationScope>(new CreationScope());

            container.Register <IQueueCreation, MessageQueueCreation>(LifeStyles.Singleton);
            container.Register <IJobSchedulerLastKnownEvent, JobSchedulerLastKnownEvent>(LifeStyles.Singleton);
            container.Register <ISendJobToQueue, SendToJobQueue>(LifeStyles.Singleton);
            container.Register <ITransportOptionsFactory, TransportOptionsFactory>(LifeStyles.Singleton);

            container.Register <IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTime>(LifeStyles.Singleton);

            container.Register <IConnectionInformation>(() => new ConnectionInformation(queueConnection),
                                                        LifeStyles.Singleton);

            container.Register <TransportOptions>(LifeStyles.Singleton);
            //**all

            //**receive
            container.Register <IReceiveMessages, MessageQueueReceive>(LifeStyles.Transient);
            //**receive

            //decorators

            //this is required for tracing to correctly add the root trace
            container.RegisterDecorator <IDataStorageSendMessage, DataStorageSendMessageDecorator>(LifeStyles.Singleton);
        }
Пример #13
0
 public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, QueueConnection queueConnectione)
 {
     container.Register <ISendMessages, SendMessagesNoOp>(LifeStyles.Singleton);
     container.Register(() => Substitute.For <IConnectionInformation>(), LifeStyles.Singleton);
     container.Register(() => Substitute.For <ICorrelationIdFactory>(),
                        LifeStyles.Singleton);
     container.Register <IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTimeNoOp>(LifeStyles.Singleton);
     container.Register <IInternalSerializer, InternalSerializerNoOp>(LifeStyles.Singleton);
 }
 /// <summary>
 /// Registers the fall backs for generic types
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 public static void RegisterFallbacks(IContainer container, RegistrationTypes registrationType)
 {
     container.RegisterConditional(typeof(ICachePolicy <>), typeof(CachePolicy <>), LifeStyles.Singleton);
     if ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
     {
         container.RegisterConditional(typeof(IProducerQueue <>), typeof(ProducerQueue <>),
                                       LifeStyles.Singleton);
     }
 }
Пример #15
0
        /// <summary>
        /// Select the registration type, and get the affiliated registration form.
        /// </summary>
        /// <param name="registrationType"></param>
        /// <returns>Returns 5KRegistration Form unless RegistrationType is "None"</returns>
        public FiveKRegistrationForm SelectRegistrationType(RegistrationTypes registrationType)
        {
            selectRegistrationType.SelectDropdownItem((int)registrationType);

            if (registrationType != RegistrationTypes.None)
            {
                //linkAddToCart.ScrollToElement(Driver);
                linkAddToCart.Click();

                return(new FiveKRegistrationForm(Driver));
            }
            else
            {
                return(null);
            }
        }
Пример #16
0
            public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType,
                                                         QueueConnection queueConnection)
            {
                container.Register(() => Substitute.For <IConnectionInformation>(),
                                   LifeStyles.Singleton);

                container.Register(() => Substitute.For <ICorrelationIdFactory>(),
                                   LifeStyles.Singleton);
                container.Register(
                    () => Substitute.For <IReceiveMessagesFactory>(), LifeStyles.Singleton);
                container.Register(
                    () => Substitute.For <IReceiveMessagesError>(), LifeStyles.Singleton);

                container.Register <IInternalSerializer, InternalSerializerNoOp>(LifeStyles.Singleton);

                container.Register <IWorkerNotificationFactory, WorkerNotificationFactoryNoOp>(LifeStyles.Singleton);
            }
Пример #17
0
        /// <summary>
        /// Setup the default policies.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void SetupDefaultPolicies(IContainer container, RegistrationTypes registrationType)
        {
            var policies  = container.GetInstance <IPolicies>();
            var noOp      = Policy.NoOp(); //thread safe - can be re-used
            var noOpAsync = Policy.NoOpAsync();

            //ReceiveMessageFromTransport
            policies.Registry[policies.Definition.ReceiveMessageFromTransport] = noOp;
            //SendHeartBeat
            policies.Registry[policies.Definition.SendHeartBeat] = noOp;
            //SendMessage
            policies.Registry[policies.Definition.SendMessage] = noOp;


            //ReceiveMessageFromTransportASync
            policies.Registry[policies.Definition.ReceiveMessageFromTransportAsync] = noOpAsync;
            //SendHeartBeatAsync
            policies.Registry[policies.Definition.SendHeartBeatAsync] = noOpAsync;
            //SendMessageAsync
            policies.Registry[policies.Definition.SendMessageAsync] = noOpAsync;
        }
Пример #18
0
        /// <summary>
        /// Registers the fall backs for generic types
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void RegisterFallbacks(IContainer container, RegistrationTypes registrationType)
        {
            container.RegisterConditional(typeof(ICachePolicy <>), typeof(CachePolicy <>), LifeStyles.Singleton);

            if ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
            {
                container.RegisterConditional(typeof(IProducerQueue <>), typeof(ProducerQueue <>),
                                              LifeStyles.Singleton);
            }

            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive &&
                (registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
            {
                container.RegisterConditional(typeof(IProducerQueueRpc <>), typeof(ProducerQueueRpc <>), LifeStyles.Singleton);
                container.RegisterConditional(typeof(IRpcQueue <,>), typeof(RpcQueue <,>), LifeStyles.Singleton);


                container.RegisterConditional(typeof(IMessageProcessingRpcSend <>), typeof(MessageProcessingRpcSend <>), LifeStyles.Singleton);
                container.RegisterConditional(typeof(IMessageProcessingRpcReceive <>), typeof(MessageProcessingRpcReceive <>), LifeStyles.Singleton);
            }
        }
Пример #19
0
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the connection.</param>
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {
            //direct (or memory) connection
            //create in memory hold
            var connection = container.GetInstance <LiteDbConnectionManager>();

            if (!connection.IsSharedConnection)
            {
                var scope = container.GetInstance <ICreationScope>();
                scope.AddScopedObject(connection);
            }

            var factory              = container.GetInstance <LiteDbMessageQueueTransportOptionsFactory>();
            var options              = factory.Create();
            var configurationSend    = container.GetInstance <QueueProducerConfiguration>();
            var configurationReceive = container.GetInstance <QueueConsumerConfiguration>();

            configurationSend.AdditionalConfiguration.SetSetting("LiteDBMessageQueueTransportOptions", options);
            configurationReceive.AdditionalConfiguration.SetSetting("LiteDBMessageQueueTransportOptions", options);

            var transportReceive = container.GetInstance <TransportConfigurationReceive>();


            transportReceive.HeartBeatSupported         = options.EnableHeartBeat && options.EnableStatus;
            transportReceive.MessageExpirationSupported = options.EnableMessageExpiration;

            transportReceive.MessageRollbackSupported = options.EnableStatus;

            transportReceive.QueueDelayBehavior.Clear();
            transportReceive.QueueDelayBehavior.Add(DefaultQueueDelay());
            transportReceive.FatalExceptionDelayBehavior.Clear();
            transportReceive.FatalExceptionDelayBehavior.Add(ExceptionDelay());

            transportReceive.LockFeatures();

            SetupHeartBeat(container);
            SetupMessageExpiration(container);
        }
Пример #20
0
 /// <summary>
 /// Allows the transport to set default configuration settings or other values
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="connectionType">Type of the requested connection.</param>
 public virtual void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
 {
 }
Пример #21
0
 /// <summary>
 /// Allows a transport to suppress specific warnings for specific types if need.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 public virtual void SuppressWarningsIfNeeded(IContainer container, RegistrationTypes registrationType)
 {
 }
Пример #22
0
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="connection">The connection.</param>
 /// <param name="queue">The queue.</param>
 public abstract void RegisterImplementations(IContainer container, RegistrationTypes registrationType, string connection, string queue);
        /// <summary>
        /// Registers the implementations.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connection">The connection.</param>
        /// <param name="queue">The queue.</param>
        public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, string connection, string queue)
        {
            Guard.NotNull(() => container, container);

            var init = new RelationalDatabaseMessageQueueInit();

            init.RegisterStandardImplementations(container, Assembly.GetAssembly(GetType()));

            //**all
            container.Register <IDbConnectionFactory, DbConnectionFactory>(LifeStyles.Singleton);
            container.Register <SqlServerMessageQueueSchema>(LifeStyles.Singleton);
            container.Register <IQueueCreation, SqlServerMessageQueueCreation>(LifeStyles.Singleton);
            container.Register <IJobSchedulerLastKnownEvent, SqlServerJobSchedulerLastKnownEvent>(LifeStyles.Singleton);
            container.Register <SqlServerJobSchema>(LifeStyles.Singleton);
            container.Register <ISendJobToQueue, SqlServerSendJobToQueue>(LifeStyles.Singleton);
            container.Register <CommandStringCache, SqlServerCommandStringCache>(LifeStyles.Singleton);
            container.Register <IOptionsSerialization, OptionsSerialization>(LifeStyles.Singleton);
            container.Register <IJobSchema, SqlServerJobSchema>(LifeStyles.Singleton);
            container.Register <IReadColumn, ReadColumn>(LifeStyles.Singleton);
            container.Register <IBuildMoveToErrorQueueSql, BuildMoveToErrorQueueSql>(LifeStyles.Singleton);
            container.Register <ITransportOptionsFactory, TransportOptionsFactory>(LifeStyles.Singleton);

            container.Register <IGetTime, SqlServerTime>(LifeStyles.Singleton);
            container.Register <IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTime>(LifeStyles.Singleton);
            container
            .Register
            <ISqlServerMessageQueueTransportOptionsFactory, SqlServerMessageQueueTransportOptionsFactory>(
                LifeStyles.Singleton);

            container.Register <ICreationScope, CreationScopeNoOp>(LifeStyles.Singleton);
            container.Register <SqlServerCommandStringCache>(LifeStyles.Singleton);

            container.Register <IConnectionInformation>(() => new SqlConnectionInformation(queue, connection), LifeStyles.Singleton);

            container.Register <SqlServerMessageQueueTransportOptions>(LifeStyles.Singleton);
            container.Register <IConnectionHeader <SqlConnection, SqlTransaction, SqlCommand>, ConnectionHeader <SqlConnection, SqlTransaction, SqlCommand> >(LifeStyles.Singleton);
            //**all

            //**receive
            container.Register <IReceiveMessages, SqlServerMessageQueueReceive>(LifeStyles.Transient);
            container.Register <IConnectionHolderFactory <SqlConnection, SqlTransaction, SqlCommand>, ConnectionHolderFactory>(LifeStyles.Singleton);
            container.Register <CommitMessage>(LifeStyles.Transient);
            container.Register <RollbackMessage>(LifeStyles.Transient);
            container.Register <HandleMessage>(LifeStyles.Transient);
            container.Register <ReceiveMessage>(LifeStyles.Transient);
            container.Register <CreateDequeueStatement>(LifeStyles.Singleton);
            container.Register <BuildDequeueCommand>(LifeStyles.Singleton);
            container.Register <ReadMessage>(LifeStyles.Singleton);
            //**receive

            //explicit registration of our job exists query
            container
            .Register <IQueryHandler <DoesJobExistQuery <SqlConnection, SqlTransaction>,
                                      QueueStatuses>,
                       DoesJobExistQueryHandler <SqlConnection, SqlTransaction> >(LifeStyles.Singleton);

            //because we have an explicit registration for job exists, we need to explicitly register the prepare statement
            container
            .Register <IPrepareQueryHandler <DoesJobExistQuery <SqlConnection, SqlTransaction>,
                                             QueueStatuses>,
                       DoesJobExistQueryPrepareHandler <SqlConnection, SqlTransaction> >(LifeStyles.Singleton);

            container
            .Register <ICommandHandlerWithOutput <SendHeartBeatCommand, DateTime?>,
                       SendHeartBeatCommandHandler>(LifeStyles.Singleton);

            container
            .Register <ICommandHandler <MoveRecordToErrorQueueCommand>,
                       MoveRecordToErrorQueueCommandHandler <SqlConnection, SqlTransaction, SqlCommand> >(LifeStyles.Singleton);

            //explicit registration of options
            container
            .Register <IQueryHandler <GetQueueOptionsQuery <SqlServerMessageQueueTransportOptions>, SqlServerMessageQueueTransportOptions>,
                       GetQueueOptionsQueryHandler <SqlServerMessageQueueTransportOptions> >(LifeStyles.Singleton);

            container
            .Register <ICommandHandlerWithOutput <DeleteTransactionalMessageCommand, long>,
                       DeleteTransactionalMessageCommandHandler <SqlConnection, SqlTransaction, SqlCommand> >(LifeStyles.Singleton);

            container
            .Register <IPrepareQueryHandler <GetQueueOptionsQuery <SqlServerMessageQueueTransportOptions>,
                                             SqlServerMessageQueueTransportOptions>,
                       GetQueueOptionsQueryPrepareHandler <SqlServerMessageQueueTransportOptions> >(LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandlerWithOutput <,>),
                                        typeof(RetryCommandHandlerOutputDecorator <,>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandler <>),
                                        typeof(RetryCommandHandlerDecorator <>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandlerWithOutputAsync <,>),
                                        typeof(RetryCommandHandlerOutputDecoratorAsync <,>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(IQueryHandler <,>),
                                        typeof(RetryQueryHandlerDecorator <,>), LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateJobTablesCommand <ITable>, QueueCreationResult>),
                typeof(CreateJobTablesCommandDecorator), LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateQueueTablesAndSaveConfigurationCommand <ITable>, QueueCreationResult>),
                typeof(CreateQueueTablesAndSaveConfigurationDecorator), LifeStyles.Singleton);
        }
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="queueConnection">Queue and connection information.</param>
 public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType,
                                              QueueConnection queueConnection)
 {
     RegisterImplementations(container, registrationType, queueConnection, Assembly.GetAssembly(GetType()));
 }
Пример #25
0
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the connection.</param>
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {
            var options = container.GetInstance<RedisQueueTransportOptions>();
            var configurationSend = container.GetInstance<QueueProducerConfiguration>();
            var configurationReceive = container.GetInstance<QueueConsumerConfiguration>();

            configurationSend.AdditionalConfiguration.SetSetting("RedisQueueTransportOptions", options);
            configurationReceive.AdditionalConfiguration.SetSetting("RedisQueueTransportOptions", options);

            var transportReceive = container.GetInstance<TransportConfigurationReceive>();
            transportReceive.HeartBeatSupported = true;
            transportReceive.MessageExpirationSupported = true;
            transportReceive.MessageRollbackSupported = true;

            transportReceive.QueueDelayBehavior.Clear();
            transportReceive.QueueDelayBehavior.Add(DefaultQueueDelay());
            transportReceive.FatalExceptionDelayBehavior.Clear();
            transportReceive.FatalExceptionDelayBehavior.Add(ExceptionDelay());

            options.TimeServer = TimeLocations.RedisServer;

            transportReceive.LockFeatures();

            SetupHeartBeat(container);
            SetupMessageExpiration(container);

            //only compile scripts if the container is not in verification mode
            if (!container.IsVerifying)
            {
                SetupScripts(container);
            }
        }
        /// <summary>
        /// Registers the defaults implementations.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void RegisterDefaults(IContainer container,
            RegistrationTypes registrationType)
        {
            Guard.NotNull(() => container, container);

            //default types that are always registered in the container for both send and receive
            RegisterSharedDefaults(container);

            //object cache
            container.Register<ObjectCache>(() => new MemoryCache("DotNetWorkQueueCache"), LifeStyles.Singleton);

            //object pool for linq 
            container.Register<IObjectPool<DynamicCodeCompiler>>(
                () =>
                    new ObjectPool<DynamicCodeCompiler>(20,
                        () => new DynamicCodeCompiler(container.GetInstance<ILogFactory>())), LifeStyles.Singleton);

            //created outside of the queue as part of setup, this must be a singleton.
            //all queues created from the setup class share the same message interceptors
            container.Register<IMessageInterceptorRegistrar, Interceptors.MessageInterceptors>(LifeStyles.Singleton);

            container.Register<MessageProcessingMode>(LifeStyles.Singleton);

            container.Register<IMessageFactory, MessageFactory>(LifeStyles.Singleton);
            container.Register<IMessageContextDataFactory, MessageContextDataFactory>(LifeStyles.Singleton);

            container.Register<IJobSchedulerMetaData, JobSchedulerMetaData>(LifeStyles.Singleton);

            container.Register<IQueueCancelWork, QueueCancelWork>(LifeStyles.Singleton);
            container.Register<ASerializer, RootSerializer>(LifeStyles.Singleton);
            container.Register<ISerializer, JsonSerializer>(LifeStyles.Singleton);
            container.Register<IExpressionSerializer, JsonExpressionSerializer>(LifeStyles.Singleton);
            container.Register<IQueueDelayFactory, QueueDelayFactory>(LifeStyles.Singleton);
            container.Register<ILinqCompiler, LinqCompiler>(LifeStyles.Singleton);

            container.Register<IInternalSerializer, JsonSerializerInternal>(LifeStyles.Singleton);
            container.Register<ICompositeSerialization, CompositeSerialization>(LifeStyles.Singleton);

            container.Register<IHeaders, Headers>(LifeStyles.Singleton);
            container.Register<IStandardHeaders, StandardHeaders>(LifeStyles.Singleton);
            container.Register<ICustomHeaders, CustomHeaders>(LifeStyles.Singleton);

            //because of it's usage in 'standard' modules, this must always be added, even if RPC is not enabled.
            //otherwise, the IoC container can't create the producer queue.
            container.Register<IRpcTimeoutFactory, RpcTimeoutFactory>(LifeStyles.Singleton);
            container.Register<IMessageMethodHandling, MessageMethodHandling>(LifeStyles.Singleton);

            container.Register<IRegisterMessagesAsync, RegisterMessagesAsync>(LifeStyles.Singleton);
            container.Register<IRegisterMessages, RegisterMessages>(LifeStyles.Singleton);

            container.Register<IMessageHandlerRegistration, MessageHandlerRegistration>(LifeStyles.Singleton);
            container
                .Register<IMessageHandlerRegistrationAsync, MessageHandlerRegistrationAsync>(LifeStyles.Singleton);

            container.Register<IGenerateReceivedMessage, GenerateReceivedMessage>(LifeStyles.Singleton);
            container.Register<IMetrics, MetricsNoOp>(LifeStyles.Singleton);


            //implementations required to send messages
            if ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
            {
                container.Register<ISentMessageFactory, SentMessageFactory>(LifeStyles.Singleton);
                container.Register<QueueConfigurationSend>(LifeStyles.Singleton);
                container.Register<QueueProducerConfiguration>(LifeStyles.Singleton);
                container.Register<TransportConfigurationSend>(LifeStyles.Singleton);
                container.Register<GenerateMessageHeaders>(LifeStyles.Singleton);
                container.Register<AddStandardMessageHeaders>(LifeStyles.Singleton);
                container.Register<IProducerMethodQueue, ProducerMethodQueue>(LifeStyles.Singleton);
                container.Register<IProducerMethodJobQueue, ProducerMethodJobQueue>(LifeStyles.Singleton);
            }

            //implementations for Receiving messages
            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive)
            {
                container.Register<TransportConfigurationReceive>(LifeStyles.Singleton);
                container.Register<IConsumerQueue, ConsumerQueue>(LifeStyles.Singleton);
                container.Register<IConsumerMethodQueue, ConsumerMethodQueue>(LifeStyles.Singleton);
                container.Register<IConsumerQueueAsync, ConsumerQueueAsync>(LifeStyles.Singleton);
                container.Register<IConsumerQueueScheduler, Scheduler>(LifeStyles.Singleton);
                container.Register<IConsumerMethodQueueScheduler, SchedulerMethod>(LifeStyles.Singleton);

                container.Register<QueueConsumerConfiguration>(LifeStyles.Singleton);

                container.Register<IHandleMessage, HandleMessage>(LifeStyles.Singleton);
                container.Register<IReceivedMessageFactory, ReceivedMessageFactory>(LifeStyles.Singleton);

                container.Register<IRetryDelayFactory, RetryDelayFactory>(LifeStyles.Singleton);
                container.Register<IRetryDelay, RetryDelay>(LifeStyles.Transient);

                container.Register<IWorkGroup, WorkGroupNoOp>(LifeStyles.Singleton);

                container.Register<IRetryInformationFactory, RetryInformationFactory>(LifeStyles.Singleton);

                container.Register<IWorkerWaitForEventOrCancel, WorkerWaitForEventOrCancel>(LifeStyles.Singleton);
                container.Register<IWaitForEventOrCancelThreadPool, WaitForEventOrCancelThreadPool>(LifeStyles.Singleton);

                container.Register<IMessageContext, MessageContext>(LifeStyles.Transient);
                container.Register<IMessageContextFactory, MessageContextFactory>(LifeStyles.Singleton);

                container.Register<IWorkerCollection, WorkerCollection>(LifeStyles.Singleton);
                container.Register<IWorker, Worker>(LifeStyles.Transient);

                container.Register<IPrimaryWorker, PrimaryWorker>(LifeStyles.Transient);
                container.Register<IPrimaryWorkerFactory, PrimaryWorkerFactory>(LifeStyles.Singleton);

                container.Register<IWorkerNameFactory, WorkerNameFactory>(LifeStyles.Singleton);
                container
                    .Register
                    <IWorkerHeartBeatNotificationFactory, WorkerHeartBeatNotificationFactory>(LifeStyles.Singleton);

                container.Register<IWorkerHeartBeatNotification, WorkerHeartBeatNotification>(LifeStyles.Transient);
                container.Register<ProcessMessage, ProcessMessage>(LifeStyles.Transient);
                container.Register<IMessageProcessingFactory, MessageProcessingFactory>(LifeStyles.Singleton);
                container.Register<MessageProcessing, MessageProcessing>(LifeStyles.Transient);

                container.Register<ITaskSchedulerConfiguration, TaskSchedulerConfiguration>(LifeStyles.Singleton);
                container.Register<ATaskScheduler, SmartThreadPoolTaskScheduler>(LifeStyles.Singleton);
                container.Register<SchedulerMessageHandler, SchedulerMessageHandler>(LifeStyles.Singleton);
                container.Register<ITaskFactory, SchedulerTaskFactory>(LifeStyles.Singleton);
                container.Register<ITaskSchedulerFactory, TaskSchedulerFactory>(LifeStyles.Singleton);
                container.Register<ITaskFactoryFactory, TaskFactoryFactory>(LifeStyles.Singleton);

                container.Register<IWorkerNotification, WorkerNotification>(LifeStyles.Transient);
                container.Register<IWorkerNotificationFactory, WorkerNotificationFactory>(LifeStyles.Singleton);

                container.Register<IAbortWorkerThread, AbortWorkerThread>(LifeStyles.Singleton);
                container.Register<StopThread>(LifeStyles.Singleton);
                container.Register<MessageExceptionHandler>(LifeStyles.Singleton);
                container.Register<MessageProcessingAsync>(LifeStyles.Transient);
                container.Register<ProcessMessageAsync>(LifeStyles.Singleton);

                container.Register<IClearExpiredMessagesMonitor, ClearExpiredMessagesMonitor>(LifeStyles.Singleton);

                container.Register<IHeartBeatThreadPoolFactory, HeartBeatThreadPoolFactory>(LifeStyles.Singleton);
                container.Register<IHeartBeatThreadPool, HeartBeatThreadPool>(LifeStyles.Singleton);

                container.Register<IHeartBeatWorkerFactory, HeartBeatWorkerFactory>(LifeStyles.Singleton);
                container.Register<IQueueWaitFactory, QueueWaitFactory>(LifeStyles.Singleton);
                container.Register<IHeartBeatMonitor, HeartBeatMonitor>(LifeStyles.Singleton);
                container.Register<IQueueMonitor, QueueMonitor>(LifeStyles.Singleton);

                container.Register<HeartBeatMonitorNoOp>(LifeStyles.Singleton);
                container.Register<ClearExpiredMessagesMonitorNoOp>(LifeStyles.Singleton);

                container.Register<IWorkerConfiguration, WorkerConfiguration>(LifeStyles.Singleton);
                container.Register<IHeartBeatConfiguration, HeartBeatConfiguration>(LifeStyles.Singleton);
                container.Register<IHeartBeatThreadPoolConfiguration, HeartBeatThreadPoolConfiguration>(
                    LifeStyles.Singleton);
                container.Register<IMessageExpirationConfiguration, MessageExpirationConfiguration>(LifeStyles.Singleton);


                container.Register<IMessageHandler, MessageHandler>(LifeStyles.Singleton);

                container.Register<IMessageHandlerAsync, MessageHandlerAsync>(LifeStyles.Singleton);

                container.Register<IWorkerFactory, WorkerFactory>(LifeStyles.Singleton);
                container.Register<StopWorker>(LifeStyles.Singleton);

                container.Register<ICommitMessage, CommitMessage>(LifeStyles.Singleton);
                container.Register<IRollbackMessage, RollbackMessage>(LifeStyles.Singleton);
                container.Register<WaitForThreadToFinish>(LifeStyles.Singleton);
                container.Register<WorkerTerminate>(LifeStyles.Singleton);
                container.Register<IWaitForEventOrCancelWorker, WaitForEventOrCancelWorker>(LifeStyles.Singleton);
                container.Register<IWaitForEventOrCancelFactory, WaitForEventOrCancelFactory>(LifeStyles.Singleton);
                container.Register<ThreadPoolConfiguration>(LifeStyles.Singleton);
            }

            //implementations for RPC / or a duplex transport
            //NOTE - we don't bother to tell the difference between RPC / duplex
            //so it's possible these are registered, but never actually used.
            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive &&
                ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send))
            {
                container.Register<IRpcMethodQueue, RpcMethodQueue>(LifeStyles.Singleton);

                container.Register<IClearExpiredMessagesRpcMonitor, ClearExpiredMessagesRpcMonitor>
                    (LifeStyles.Singleton);

                container.Register<IResponseIdFactory, ResponseIdFactory>(LifeStyles.Singleton);
                container.Register<IRpcContextFactory, RpcContextFactory>(LifeStyles.Singleton);
                container.Register<QueueRpcConfiguration>(LifeStyles.Singleton);
            }
        }
Пример #27
0
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="queueConnection">Queue and connection information.</param>
 public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, QueueConnection queueConnection)
 {
     RegisterConnectionImplementation.RegisterImplementations(container, queueConnection);
 }
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the requested connection.</param>
        public virtual void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {

        }
Пример #29
0
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="queueConnection">Queue and connection information.</param>
 public abstract void RegisterImplementations(IContainer container, RegistrationTypes registrationType, QueueConnection queueConnection);
        /// <summary>
        /// Allows a transport to suppress specific warnings for specific types if newed.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public virtual void SuppressWarningsIfNeeded(IContainer container, RegistrationTypes registrationType)
        {

        }
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the connection.</param>
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {
            var factory = container.GetInstance<ISqLiteMessageQueueTransportOptionsFactory>();
            var options = factory.Create();
            var configurationSend = container.GetInstance<QueueProducerConfiguration>();
            var configurationReceive = container.GetInstance<QueueConsumerConfiguration>();

            configurationSend.AdditionalConfiguration.SetSetting("SQLiteMessageQueueTransportOptions", options);
            configurationReceive.AdditionalConfiguration.SetSetting("SQLiteMessageQueueTransportOptions", options);

            var transportReceive = container.GetInstance<TransportConfigurationReceive>();


            transportReceive.HeartBeatSupported = options.EnableHeartBeat && options.EnableStatus;

            transportReceive.MessageExpirationSupported = options.EnableMessageExpiration ||
                                                          options.QueueType == QueueTypes.RpcReceive ||
                                                          options.QueueType == QueueTypes.RpcSend;

            transportReceive.MessageRollbackSupported = options.EnableStatus;

            transportReceive.QueueDelayBehavior.Clear();
            transportReceive.QueueDelayBehavior.Add(DefaultQueueDelay());
            transportReceive.FatalExceptionDelayBehavior.Clear();
            transportReceive.FatalExceptionDelayBehavior.Add(ExceptionDelay());

            transportReceive.LockFeatures();

            SetupHeartBeat(container);
            SetupMessageExpiration(container);

            //create in memory hold
            var connection = container.GetInstance<IConnectionInformation>();
            var fileName = GetFileNameFromConnectionString.GetFileName(connection.ConnectionString);
            if(fileName.IsInMemory)
            {
                var scope = container.GetInstance<ICreationScope>();
                var holder = new SqLiteHoldConnection();
                holder.AddConnectionIfNeeded(connection);
                scope.AddScopedObject(holder);
            }
        }
        /// <summary>
        /// Registers the defaults implementations.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void RegisterDefaults(IContainer container,
                                            RegistrationTypes registrationType)
        {
            Guard.NotNull(() => container, container);

            //default types that are always registered in the container for both send and receive
            RegisterSharedDefaults(container);

            //object cache
            var memoryCache         = new MemoryCache(new MemoryCacheOptions());
            var memoryCacheProvider = new MemoryCacheProvider(memoryCache);

            container.Register(() => memoryCacheProvider, LifeStyles.Singleton);

            //object pool for linq
            container.Register <IObjectPool <DynamicCodeCompiler> >(
                () =>
                new ObjectPool <DynamicCodeCompiler>(20,
                                                     () => new DynamicCodeCompiler(container.GetInstance <ILogger>())), LifeStyles.Singleton);

            //created outside of the queue as part of setup, this must be a singleton.
            //all queues created from the setup class share the same message interceptors
            container.Register <IMessageInterceptorRegistrar, MessageInterceptors>(LifeStyles.Singleton);

            container.Register <MessageProcessingMode>(LifeStyles.Singleton);
            container.Register <IGetPreviousMessageErrors, GetPreviousMessageErrorsNoOp>(LifeStyles.Singleton);

            container.Register <IMessageFactory, MessageFactory>(LifeStyles.Singleton);


            container.Register <IJobSchedulerMetaData, JobSchedulerMetaData>(LifeStyles.Singleton);

            container.Register <IQueueCancelWork, QueueCancelWork>(LifeStyles.Singleton);
            container.Register <ASerializer, RootSerializer>(LifeStyles.Singleton);
            container.Register <ISerializer, JsonSerializer>(LifeStyles.Singleton);
            container.Register <IExpressionSerializer, JsonExpressionSerializer>(LifeStyles.Singleton);
            container.Register <IQueueDelayFactory, QueueDelayFactory>(LifeStyles.Singleton);
            container.Register <ILinqCompiler, LinqCompiler>(LifeStyles.Singleton);
            container.Register <IGetHeader, GetHeaderDefault>(LifeStyles.Singleton);

            container.Register <IInternalSerializer, JsonSerializerInternal>(LifeStyles.Singleton);
            container.Register <ICompositeSerialization, CompositeSerialization>(LifeStyles.Singleton);

            container.Register <IMessageMethodHandling, MessageMethodHandling>(LifeStyles.Singleton);

            container.Register <IRegisterMessagesAsync, RegisterMessagesAsync>(LifeStyles.Singleton);
            container.Register <IRegisterMessages, RegisterMessages>(LifeStyles.Singleton);

            container.Register <IMessageHandlerRegistration, MessageHandlerRegistration>(LifeStyles.Singleton);
            container
            .Register <IMessageHandlerRegistrationAsync, MessageHandlerRegistrationAsync>(LifeStyles.Singleton);

            container.Register <IGenerateReceivedMessage, GenerateReceivedMessage>(LifeStyles.Singleton);
            container.Register <IMetrics, MetricsNoOp>(LifeStyles.Singleton);

            //implementations required to send messages
            if ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
            {
                container.Register <ISentMessageFactory, SentMessageFactory>(LifeStyles.Singleton);
                container.Register <QueueConfigurationSend>(LifeStyles.Singleton);
                container.Register <QueueProducerConfiguration>(LifeStyles.Singleton);
                container.Register <TransportConfigurationSend>(LifeStyles.Singleton);
                container.Register <GenerateMessageHeaders>(LifeStyles.Singleton);
                container.Register <AddStandardMessageHeaders>(LifeStyles.Singleton);
                container.Register <IProducerMethodQueue, ProducerMethodQueue>(LifeStyles.Singleton);
                container.Register <IProducerMethodJobQueue, ProducerMethodJobQueue>(LifeStyles.Singleton);
            }

            //implementations for Receiving messages
            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive)
            {
                container.Register <TransportConfigurationReceive>(LifeStyles.Singleton);
                container.Register <IConsumerQueue, ConsumerQueue>(LifeStyles.Singleton);
                container.Register <IConsumerMethodQueue, ConsumerMethodQueue>(LifeStyles.Singleton);
                container.Register <IConsumerQueueAsync, ConsumerQueueAsync>(LifeStyles.Singleton);
                container.Register <IConsumerQueueScheduler, Scheduler>(LifeStyles.Singleton);
                container.Register <IConsumerMethodQueueScheduler, SchedulerMethod>(LifeStyles.Singleton);

                container.Register <QueueConsumerConfiguration>(LifeStyles.Singleton);

                container.Register <IHandleMessage, HandleMessage>(LifeStyles.Singleton);
                container.Register <IReceivedMessageFactory, ReceivedMessageFactory>(LifeStyles.Singleton);

                container.Register <IRetryDelayFactory, RetryDelayFactory>(LifeStyles.Singleton);
                container.Register <IRetryDelay, RetryDelay>(LifeStyles.Transient);

                container.Register <IWorkGroup, WorkGroupNoOp>(LifeStyles.Singleton);

                container.Register <IRetryInformationFactory, RetryInformationFactory>(LifeStyles.Singleton);

                container.Register <IWorkerWaitForEventOrCancel, WorkerWaitForEventOrCancel>(LifeStyles.Singleton);
                container.Register <IWaitForEventOrCancelThreadPool, WaitForEventOrCancelThreadPool>(LifeStyles.Singleton);

                container.Register <IMessageContext, MessageContext>(LifeStyles.Transient);
                container.AddTypeThatNeedsWarningSuppression(typeof(IMessageContext));
                container.AddTypeThatNeedsWarningSuppression(typeof(MessageContext));

                container.Register <IMessageContextFactory, MessageContextFactory>(LifeStyles.Singleton);

                container.Register <IWorkerCollection, WorkerCollection>(LifeStyles.Singleton);

                container.Register <IWorker, Worker>(LifeStyles.Transient);
                container.AddTypeThatNeedsWarningSuppression(typeof(IWorker));

                container.Register <IPrimaryWorker, PrimaryWorker>(LifeStyles.Transient);
                container.AddTypeThatNeedsWarningSuppression(typeof(IPrimaryWorker));

                container.Register <IPrimaryWorkerFactory, PrimaryWorkerFactory>(LifeStyles.Singleton);

                container.Register <IWorkerNameFactory, WorkerNameFactory>(LifeStyles.Singleton);
                container
                .Register
                <IWorkerHeartBeatNotificationFactory, WorkerHeartBeatNotificationFactory>(LifeStyles.Singleton);

                container.Register <IWorkerHeartBeatNotification, WorkerHeartBeatNotification>(LifeStyles.Transient);
                container.Register <ProcessMessage, ProcessMessage>(LifeStyles.Transient);
                container.Register <IMessageProcessingFactory, MessageProcessingFactory>(LifeStyles.Singleton);
                container.Register <MessageProcessing, MessageProcessing>(LifeStyles.Transient);

                container.Register <ITaskSchedulerConfiguration, TaskSchedulerConfiguration>(LifeStyles.Singleton);
                container.Register <ATaskScheduler, SmartThreadPoolTaskScheduler>(LifeStyles.Singleton);
                container.Register <ISchedulerMessageHandler, SchedulerMessageHandler>(LifeStyles.Singleton);
                container.Register <ITaskFactory, SchedulerTaskFactory>(LifeStyles.Singleton);
                container.Register <ITaskSchedulerFactory, TaskSchedulerFactory>(LifeStyles.Singleton);
                container.Register <ITaskFactoryFactory, TaskFactoryFactory>(LifeStyles.Singleton);

                container.Register <IWorkerNotification, WorkerNotification>(LifeStyles.Transient);
                container.Register <IWorkerNotificationFactory, WorkerNotificationFactory>(LifeStyles.Singleton);

                container.Register <IAbortWorkerThread, AbortWorkerThread>(LifeStyles.Singleton);
                container.Register <StopThread>(LifeStyles.Singleton);
                container.Register <MessageExceptionHandler>(LifeStyles.Singleton);
                container.Register <MessageProcessingAsync>(LifeStyles.Transient);
                container.Register <ProcessMessageAsync>(LifeStyles.Singleton);

                container.Register <IClearExpiredMessagesMonitor, ClearExpiredMessagesMonitor>(LifeStyles.Singleton);
                container.Register <IClearErrorMessagesMonitor, ClearErrorMessagesMonitor>(LifeStyles.Singleton);

                container.Register <IHeartBeatScheduler, HeartBeatScheduler>(LifeStyles.Singleton);

                container.Register <IHeartBeatWorkerFactory, HeartBeatWorkerFactory>(LifeStyles.Singleton);
                container.Register <IQueueWaitFactory, QueueWaitFactory>(LifeStyles.Singleton);
                container.Register <IHeartBeatMonitor, HeartBeatMonitor>(LifeStyles.Singleton);
                container.Register <IQueueMonitor, QueueMonitor>(LifeStyles.Singleton);

                container.Register <HeartBeatMonitorNoOp>(LifeStyles.Singleton);
                container.Register <ClearExpiredMessagesMonitorNoOp>(LifeStyles.Singleton);

                container.Register <IWorkerConfiguration, WorkerConfiguration>(LifeStyles.Singleton);
                container.Register <IHeartBeatConfiguration, HeartBeatConfiguration>(LifeStyles.Singleton);
                container.Register <IHeartBeatThreadPoolConfiguration, HeartBeatThreadPoolConfiguration>(
                    LifeStyles.Singleton);
                container.Register <IMessageExpirationConfiguration, MessageExpirationConfiguration>(LifeStyles.Singleton);
                container.Register <IMessageErrorConfiguration, MessageErrorConfiguration>(LifeStyles.Singleton);

                container.Register <IMessageHandler, MessageHandler>(LifeStyles.Singleton);

                container.Register <IMessageHandlerAsync, MessageHandlerAsync>(LifeStyles.Singleton);

                container.Register <IWorkerFactory, WorkerFactory>(LifeStyles.Singleton);
                container.Register <StopWorker>(LifeStyles.Singleton);

                container.Register <ICommitMessage, CommitMessage>(LifeStyles.Singleton);
                container.Register <IRollbackMessage, RollbackMessage>(LifeStyles.Singleton);
                container.Register <WaitForThreadToFinish>(LifeStyles.Singleton);
                container.Register <WorkerTerminate>(LifeStyles.Singleton);
                container.Register <IWaitForEventOrCancelWorker, WaitForEventOrCancelWorker>(LifeStyles.Singleton);
                container.Register <IWaitForEventOrCancelFactory, WaitForEventOrCancelFactory>(LifeStyles.Singleton);
                container.Register <ThreadPoolConfiguration>(LifeStyles.Singleton);
            }
        }
        /// <summary>
        /// Registers the fall backs for generic types
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void RegisterFallbacks(IContainer container, RegistrationTypes registrationType)
        {
            container.RegisterConditional(typeof(ICachePolicy<>), typeof(CachePolicy<>), LifeStyles.Singleton);

            if ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
            {
                container.RegisterConditional(typeof (IProducerQueue<>), typeof (ProducerQueue<>),
                    LifeStyles.Singleton);
            }

            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive &&
            ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send))
            {
                container.RegisterConditional(typeof(IProducerQueueRpc<>), typeof(ProducerQueueRpc<>), LifeStyles.Singleton);
                container.RegisterConditional(typeof(IRpcQueue<,>), typeof(RpcQueue<,>), LifeStyles.Singleton);
 

                container.RegisterConditional(typeof(IMessageProcessingRpcSend<>), typeof(MessageProcessingRpcSend<>), LifeStyles.Singleton);
                container.RegisterConditional(typeof(IMessageProcessingRpcReceive<>), typeof(MessageProcessingRpcReceive<>), LifeStyles.Singleton);
            }
        }
        /// <summary>
        /// Allows the transport to set default configuration settings or other values
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connectionType">Type of the connection.</param>
        public override void SetDefaultsIfNeeded(IContainer container, RegistrationTypes registrationType, ConnectionTypes connectionType)
        {
            var factory = container.GetInstance<IPostgreSqlMessageQueueTransportOptionsFactory>();
            var options = factory.Create();
            var configurationSend = container.GetInstance<QueueProducerConfiguration>();
            var configurationReceive = container.GetInstance<QueueConsumerConfiguration>();

            configurationSend.AdditionalConfiguration.SetSetting("PostgreSQLMessageQueueTransportOptions", options);
            configurationReceive.AdditionalConfiguration.SetSetting("PostgreSQLMessageQueueTransportOptions", options);

            var transportReceive = container.GetInstance<TransportConfigurationReceive>();


            transportReceive.HeartBeatSupported = options.EnableHeartBeat && options.EnableStatus &&
                                                  !options.EnableHoldTransactionUntilMessageCommited;

            transportReceive.MessageExpirationSupported = options.EnableMessageExpiration ||
                                                          options.QueueType == QueueTypes.RpcReceive ||
                                                          options.QueueType == QueueTypes.RpcSend;

            transportReceive.MessageRollbackSupported = options.EnableStatus ||
                                                        options.EnableHoldTransactionUntilMessageCommited;

            transportReceive.QueueDelayBehavior.Clear();
            transportReceive.QueueDelayBehavior.Add(DefaultQueueDelay());
            transportReceive.FatalExceptionDelayBehavior.Clear();
            transportReceive.FatalExceptionDelayBehavior.Add(ExceptionDelay());

            transportReceive.LockFeatures();

            SetupHeartBeat(container);
            SetupMessageExpiration(container);
        }
        /// <summary>
        /// Suppress warnings for specific cases.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void SuppressWarningsIfNeeded(IContainer container, RegistrationTypes registrationType)
        {
            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive)
            {
                container.SuppressDiagnosticWarning(typeof(IMessageContext),
                    DiagnosticTypes.DisposableTransientComponent,
                    "IMessageContext is explicitly disposed of via a using statement");

                container.SuppressDiagnosticWarning(typeof(MessageContext),
                  DiagnosticTypes.DisposableTransientComponent,
                  "MessageContext is explicitly disposed of via a using statement");

                container.SuppressDiagnosticWarning(typeof(ATaskScheduler),
                    DiagnosticTypes.DisposableTransientComponent,
                    "ATaskScheduler is disposed of via its parent queue if created by this library. Otherwise, the caller of this library is responsible for disposing the task scheduler");

                container.SuppressDiagnosticWarning(typeof(IWorker),
                   DiagnosticTypes.DisposableTransientComponent,
                    "IWorker is disposed of via the worker collection");

                container.SuppressDiagnosticWarning(typeof(IPrimaryWorker),
                   DiagnosticTypes.DisposableTransientComponent,
                   "IPrimaryWorker is disposed of via the queue");
            }
        }
Пример #36
0
        /// <summary>
        /// Registers the defaults implementations.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        public static void RegisterDefaults(IContainer container,
                                            RegistrationTypes registrationType)
        {
            Guard.NotNull(() => container, container);

            //default types that are always registered in the container for both send and receive
            RegisterSharedDefaults(container);

            //object cache
            container.Register(() => CacheFactory.Build("DotNetWorkQueueCache", settings =>
            {
#if NETFULL
                settings.WithSystemRuntimeCacheHandle("LinqCache");
#else
                settings.WithMicrosoftMemoryCacheHandle("LinqCache");
#endif
            }), LifeStyles.Singleton);

            //object pool for linq
            container.Register <IObjectPool <DynamicCodeCompiler> >(
                () =>
                new ObjectPool <DynamicCodeCompiler>(20,
                                                     () => new DynamicCodeCompiler(container.GetInstance <ILogFactory>())), LifeStyles.Singleton);

            //created outside of the queue as part of setup, this must be a singleton.
            //all queues created from the setup class share the same message interceptors
            container.Register <IMessageInterceptorRegistrar, MessageInterceptors>(LifeStyles.Singleton);

            container.Register <MessageProcessingMode>(LifeStyles.Singleton);

            container.Register <IMessageFactory, MessageFactory>(LifeStyles.Singleton);
            container.Register <IMessageContextDataFactory, MessageContextDataFactory>(LifeStyles.Singleton);

            container.Register <IJobSchedulerMetaData, JobSchedulerMetaData>(LifeStyles.Singleton);

            container.Register <IQueueCancelWork, QueueCancelWork>(LifeStyles.Singleton);
            container.Register <ASerializer, RootSerializer>(LifeStyles.Singleton);
            container.Register <ISerializer, JsonSerializer>(LifeStyles.Singleton);
            container.Register <IExpressionSerializer, JsonExpressionSerializer>(LifeStyles.Singleton);
            container.Register <IQueueDelayFactory, QueueDelayFactory>(LifeStyles.Singleton);
            container.Register <ILinqCompiler, LinqCompiler>(LifeStyles.Singleton);

            container.Register <IInternalSerializer, JsonSerializerInternal>(LifeStyles.Singleton);
            container.Register <ICompositeSerialization, CompositeSerialization>(LifeStyles.Singleton);

            container.Register <IHeaders, Headers>(LifeStyles.Singleton);
            container.Register <IStandardHeaders, StandardHeaders>(LifeStyles.Singleton);
            container.Register <ICustomHeaders, CustomHeaders>(LifeStyles.Singleton);

            //because of it's usage in 'standard' modules, this must always be added, even if RPC is not enabled.
            //otherwise, the IoC container can't create the producer queue.
            container.Register <IRpcTimeoutFactory, RpcTimeoutFactory>(LifeStyles.Singleton);
            container.Register <IMessageMethodHandling, MessageMethodHandling>(LifeStyles.Singleton);

            container.Register <IRegisterMessagesAsync, RegisterMessagesAsync>(LifeStyles.Singleton);
            container.Register <IRegisterMessages, RegisterMessages>(LifeStyles.Singleton);

            container.Register <IMessageHandlerRegistration, MessageHandlerRegistration>(LifeStyles.Singleton);
            container
            .Register <IMessageHandlerRegistrationAsync, MessageHandlerRegistrationAsync>(LifeStyles.Singleton);

            container.Register <IGenerateReceivedMessage, GenerateReceivedMessage>(LifeStyles.Singleton);
            container.Register <IMetrics, MetricsNoOp>(LifeStyles.Singleton);

            //implementations required to send messages
            if ((registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
            {
                container.Register <ISentMessageFactory, SentMessageFactory>(LifeStyles.Singleton);
                container.Register <QueueConfigurationSend>(LifeStyles.Singleton);
                container.Register <QueueProducerConfiguration>(LifeStyles.Singleton);
                container.Register <TransportConfigurationSend>(LifeStyles.Singleton);
                container.Register <GenerateMessageHeaders>(LifeStyles.Singleton);
                container.Register <AddStandardMessageHeaders>(LifeStyles.Singleton);
                container.Register <IProducerMethodQueue, ProducerMethodQueue>(LifeStyles.Singleton);
                container.Register <IProducerMethodJobQueue, ProducerMethodJobQueue>(LifeStyles.Singleton);
            }

            //implementations for Receiving messages
            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive)
            {
                container.Register <TransportConfigurationReceive>(LifeStyles.Singleton);
                container.Register <IConsumerQueue, ConsumerQueue>(LifeStyles.Singleton);
                container.Register <IConsumerMethodQueue, ConsumerMethodQueue>(LifeStyles.Singleton);
                container.Register <IConsumerQueueAsync, ConsumerQueueAsync>(LifeStyles.Singleton);
                container.Register <IConsumerQueueScheduler, Scheduler>(LifeStyles.Singleton);
                container.Register <IConsumerMethodQueueScheduler, SchedulerMethod>(LifeStyles.Singleton);

                container.Register <QueueConsumerConfiguration>(LifeStyles.Singleton);

                container.Register <IHandleMessage, HandleMessage>(LifeStyles.Singleton);
                container.Register <IReceivedMessageFactory, ReceivedMessageFactory>(LifeStyles.Singleton);

                container.Register <IRetryDelayFactory, RetryDelayFactory>(LifeStyles.Singleton);
                container.Register <IRetryDelay, RetryDelay>(LifeStyles.Transient);

                container.Register <IWorkGroup, WorkGroupNoOp>(LifeStyles.Singleton);

                container.Register <IRetryInformationFactory, RetryInformationFactory>(LifeStyles.Singleton);

                container.Register <IWorkerWaitForEventOrCancel, WorkerWaitForEventOrCancel>(LifeStyles.Singleton);
                container.Register <IWaitForEventOrCancelThreadPool, WaitForEventOrCancelThreadPool>(LifeStyles.Singleton);

                container.Register <IMessageContext, MessageContext>(LifeStyles.Transient);
                container.Register <IMessageContextFactory, MessageContextFactory>(LifeStyles.Singleton);

                container.Register <IWorkerCollection, WorkerCollection>(LifeStyles.Singleton);
                container.Register <IWorker, Worker>(LifeStyles.Transient);

                container.Register <IPrimaryWorker, PrimaryWorker>(LifeStyles.Transient);
                container.Register <IPrimaryWorkerFactory, PrimaryWorkerFactory>(LifeStyles.Singleton);

                container.Register <IWorkerNameFactory, WorkerNameFactory>(LifeStyles.Singleton);
                container
                .Register
                <IWorkerHeartBeatNotificationFactory, WorkerHeartBeatNotificationFactory>(LifeStyles.Singleton);

                container.Register <IWorkerHeartBeatNotification, WorkerHeartBeatNotification>(LifeStyles.Transient);
                container.Register <ProcessMessage, ProcessMessage>(LifeStyles.Transient);
                container.Register <IMessageProcessingFactory, MessageProcessingFactory>(LifeStyles.Singleton);
                container.Register <MessageProcessing, MessageProcessing>(LifeStyles.Transient);

                container.Register <ITaskSchedulerConfiguration, TaskSchedulerConfiguration>(LifeStyles.Singleton);
                container.Register <ATaskScheduler, SmartThreadPoolTaskScheduler>(LifeStyles.Singleton);
                container.Register <SchedulerMessageHandler, SchedulerMessageHandler>(LifeStyles.Singleton);
                container.Register <ITaskFactory, SchedulerTaskFactory>(LifeStyles.Singleton);
                container.Register <ITaskSchedulerFactory, TaskSchedulerFactory>(LifeStyles.Singleton);
                container.Register <ITaskFactoryFactory, TaskFactoryFactory>(LifeStyles.Singleton);

                container.Register <IWorkerNotification, WorkerNotification>(LifeStyles.Transient);
                container.Register <IWorkerNotificationFactory, WorkerNotificationFactory>(LifeStyles.Singleton);

                container.Register <IAbortWorkerThread, AbortWorkerThread>(LifeStyles.Singleton);
                container.Register <StopThread>(LifeStyles.Singleton);
                container.Register <MessageExceptionHandler>(LifeStyles.Singleton);
                container.Register <MessageProcessingAsync>(LifeStyles.Transient);
                container.Register <ProcessMessageAsync>(LifeStyles.Singleton);

                container.Register <IClearExpiredMessagesMonitor, ClearExpiredMessagesMonitor>(LifeStyles.Singleton);

                container.Register <IHeartBeatScheduler, HeartBeatScheduler>(LifeStyles.Singleton);

                container.Register <IHeartBeatWorkerFactory, HeartBeatWorkerFactory>(LifeStyles.Singleton);
                container.Register <IQueueWaitFactory, QueueWaitFactory>(LifeStyles.Singleton);
                container.Register <IHeartBeatMonitor, HeartBeatMonitor>(LifeStyles.Singleton);
                container.Register <IQueueMonitor, QueueMonitor>(LifeStyles.Singleton);

                container.Register <HeartBeatMonitorNoOp>(LifeStyles.Singleton);
                container.Register <ClearExpiredMessagesMonitorNoOp>(LifeStyles.Singleton);

                container.Register <IWorkerConfiguration, WorkerConfiguration>(LifeStyles.Singleton);
                container.Register <IHeartBeatConfiguration, HeartBeatConfiguration>(LifeStyles.Singleton);
                container.Register <IHeartBeatThreadPoolConfiguration, HeartBeatThreadPoolConfiguration>(
                    LifeStyles.Singleton);
                container.Register <IMessageExpirationConfiguration, MessageExpirationConfiguration>(LifeStyles.Singleton);


                container.Register <IMessageHandler, MessageHandler>(LifeStyles.Singleton);

                container.Register <IMessageHandlerAsync, MessageHandlerAsync>(LifeStyles.Singleton);

                container.Register <IWorkerFactory, WorkerFactory>(LifeStyles.Singleton);
                container.Register <StopWorker>(LifeStyles.Singleton);

                container.Register <ICommitMessage, CommitMessage>(LifeStyles.Singleton);
                container.Register <IRollbackMessage, RollbackMessage>(LifeStyles.Singleton);
                container.Register <WaitForThreadToFinish>(LifeStyles.Singleton);
                container.Register <WorkerTerminate>(LifeStyles.Singleton);
                container.Register <IWaitForEventOrCancelWorker, WaitForEventOrCancelWorker>(LifeStyles.Singleton);
                container.Register <IWaitForEventOrCancelFactory, WaitForEventOrCancelFactory>(LifeStyles.Singleton);
                container.Register <ThreadPoolConfiguration>(LifeStyles.Singleton);
            }

            //implementations for RPC / or a duplex transport
            //NOTE - we don't bother to tell the difference between RPC / duplex
            //so it's possible these are registered, but never actually used.
            if ((registrationType & RegistrationTypes.Receive) == RegistrationTypes.Receive &&
                (registrationType & RegistrationTypes.Send) == RegistrationTypes.Send)
            {
                container.Register <IRpcMethodQueue, RpcMethodQueue>(LifeStyles.Singleton);

                container.Register <IClearExpiredMessagesRpcMonitor, ClearExpiredMessagesRpcMonitor>
                    (LifeStyles.Singleton);

                container.Register <IResponseIdFactory, ResponseIdFactory>(LifeStyles.Singleton);
                container.Register <IRpcContextFactory, RpcContextFactory>(LifeStyles.Singleton);
                container.Register <QueueRpcConfiguration>(LifeStyles.Singleton);
            }
        }
        /// <summary>
        /// Registers the implementations.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="queueConnection">Queue and connection information.</param>
        /// <param name="assemblies">The assemblies.</param>
        public virtual void RegisterImplementations(IContainer container, RegistrationTypes registrationType,
                                                    QueueConnection queueConnection, params Assembly[] assemblies)
        {
            Guard.NotNull(() => container, container);
            base.RegisterImplementations(container, registrationType, queueConnection);
            var init = new RelationalDatabaseMessageQueueInit <long, Guid>();

            init.RegisterStandardImplementations(container, assemblies);

            //**all
            container.RegisterNonScopedSingleton <ICreationScope>(new CreationScope());

            container.Register <SqLiteMessageQueueSchema>(LifeStyles.Singleton);
            container.Register <IQueueCreation, SqLiteMessageQueueCreation>(LifeStyles.Singleton);
            container.Register <IJobSchedulerLastKnownEvent, SqliteJobSchedulerLastKnownEvent>(LifeStyles.Singleton);
            container.Register <ISendJobToQueue, SqliteSendToJobQueue>(LifeStyles.Singleton);
            container.Register <IDbConnectionFactory, DbConnectionFactory>(LifeStyles.Singleton);
            container.Register <SqliteJobSchema>(LifeStyles.Singleton);
            container.Register <IOptionsSerialization, OptionsSerialization>(LifeStyles.Singleton);
            container.Register <CommandStringCache, IDbCommandStringCache>(LifeStyles.Singleton);
            container.Register <ITransportOptionsFactory, TransportOptionsFactory>(LifeStyles.Singleton);
            container.Register <ITransactionFactory, TransactionFactory>(LifeStyles.Singleton);
            container.Register <IJobSchema, SqliteJobSchema>(LifeStyles.Singleton);
            container.Register <IReadColumn, ReadColumn>(LifeStyles.Singleton);
            container.Register <IBuildMoveToErrorQueueSql, BuildMoveToErrorQueueSql>(LifeStyles.Singleton);
            container.Register <IGetPreviousMessageErrors, GetPreviousMessageErrors <long> >(LifeStyles.Singleton);

            container.Register <IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTime>(LifeStyles.Singleton);
            container
            .Register
            <ISqLiteMessageQueueTransportOptionsFactory, SqLiteMessageQueueTransportOptionsFactory>(
                LifeStyles.Singleton);

            container.Register <IDbCommandStringCache>(LifeStyles.Singleton);

            container.Register <IConnectionInformation>(
                () => new SqliteConnectionInformation(queueConnection, container.GetInstance <IDbDataSource>()),
                LifeStyles.Singleton);

            container.Register <BuildDequeueCommand>(LifeStyles.Singleton);
            container.Register <MessageDeQueue>(LifeStyles.Singleton);

            container.Register <SqLiteMessageQueueTransportOptions>(LifeStyles.Singleton);

            container
            .Register <IConnectionHeader <IDbConnection, IDbTransaction, IDbCommand>,
                       ConnectionHeader <IDbConnection, IDbTransaction, IDbCommand> >(LifeStyles.Singleton);
            container.Register <ISQLiteTransactionWrapper, SqLiteTransactionWrapper>(LifeStyles.Transient);
            //**all

            //**receive
            container.Register <IReceiveMessages, SqLiteMessageQueueReceive>(LifeStyles.Transient);
            container.Register <ITransportRollbackMessage, RollbackMessage>(LifeStyles.Singleton);
            container.Register <ReceiveMessage>(LifeStyles.Transient);
            //**receive

            //reset heart beat
            container
            .Register <IPrepareCommandHandler <ResetHeartBeatCommand <long> >,
                       ResetHeartBeatCommandPrepareHandler>(LifeStyles.Singleton);

            container
            .Register <IPrepareCommandHandler <MoveRecordToErrorQueueCommand <long> >,
                       MoveRecordToErrorQueueCommandPrepareHandler>(LifeStyles.Singleton);

            //explicit registration of our job exists query
            container
            .Register <IQueryHandler <DoesJobExistQuery <IDbConnection, IDbTransaction>,
                                      QueueStatuses>,
                       DoesJobExistQueryHandler <IDbConnection, IDbTransaction> >(LifeStyles.Singleton);

            //because we have an explicit registration for job exists, we need to explicitly register the prepare statement
            container
            .Register <IPrepareQueryHandler <DoesJobExistQuery <IDbConnection, IDbTransaction>,
                                             QueueStatuses>,
                       DoesJobExistQueryPrepareHandler <IDbConnection, IDbTransaction> >(LifeStyles.Singleton);

            container
            .Register <ICommandHandler <MoveRecordToErrorQueueCommand <long> >,
                       MoveRecordToErrorQueueCommandHandler <IDbConnection, IDbTransaction, IDbCommand> >(LifeStyles
                                                                                                          .Singleton);

            //expired messages
            container
            .Register <IPrepareQueryHandler <FindExpiredMessagesToDeleteQuery <long>, IEnumerable <long> >,
                       FindExpiredRecordsToDeleteQueryPrepareHandler>(LifeStyles.Singleton);

            //error messages
            container
            .Register <IPrepareQueryHandler <FindErrorMessagesToDeleteQuery <long>, IEnumerable <long> >,
                       FindErrorRecordsToDeleteQueryPrepareHandler>(LifeStyles.Singleton);

            //heartbeat
            container
            .Register <IPrepareQueryHandler <FindMessagesToResetByHeartBeatQuery <long>, IEnumerable <MessageToReset <long> > >,
                       FindRecordsToResetByHeartBeatQueryPrepareHandler>(LifeStyles.Singleton);

            //explicit registration of options
            container
            .Register <IQueryHandler <GetQueueOptionsQuery <SqLiteMessageQueueTransportOptions>,
                                      SqLiteMessageQueueTransportOptions>,
                       GetQueueOptionsQueryHandler <SqLiteMessageQueueTransportOptions> >(LifeStyles.Singleton);

            container
            .Register <IPrepareQueryHandler <GetQueueOptionsQuery <SqLiteMessageQueueTransportOptions>,
                                             SqLiteMessageQueueTransportOptions>,
                       GetQueueOptionsQueryPrepareHandler <SqLiteMessageQueueTransportOptions> >(LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ISQLiteTransactionWrapper),
                                        typeof(BeginTransactionRetryDecorator), LifeStyles.Transient);

            //register our decorator for deleting messages
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <DeleteMessageCommand <long>, long>),
                typeof(DeleteMessageCommandDecorator), LifeStyles.Singleton);

            //register our decorator for setting the status
            container.RegisterDecorator(
                typeof(ICommandHandler <DeleteStatusTableStatusCommand <long> >),
                typeof(SetStatusTableStatusCommandDecorator), LifeStyles.Singleton);

            //register our decorator for resetting the heart beat
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <ResetHeartBeatCommand <long>, long>),
                typeof(ResetHeartBeatCommandDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(ICommandHandler <MoveRecordToErrorQueueCommand <long> >),
                typeof(MoveRecordToErrorQueueCommandDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(IQueryHandler <GetErrorRecordExistsQuery <long>, bool>),
                typeof(GetErrorRecordExistsQueryDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(IQueryHandler <FindExpiredMessagesToDeleteQuery <long>, IEnumerable <long> >),
                typeof(FindExpiredRecordsToDeleteDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(IQueryHandler <FindMessagesToResetByHeartBeatQuery <long>, IEnumerable <MessageToReset <long> > >),
                typeof(FindRecordsToResetByHeartBeatDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(IQueryHandler <GetColumnNamesFromTableQuery, List <string> >),
                typeof(GetColumnNamesFromTableDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(IQueryHandler <GetTableExistsQuery, bool>),
                typeof(GetTableExistsDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(IQueryHandler <DoesJobExistQuery <IDbConnection, IDbTransaction>, QueueStatuses>),
                typeof(DoesJobExistDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <DeleteQueueTablesCommand, QueueRemoveResult>),
                typeof(DeleteQueueTablesDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(ICommandHandler <SetErrorCountCommand <long> >),
                typeof(SetErrorCountCommandDecorator), LifeStyles.Singleton);

            //trace fallback command
            container.RegisterDecorator(
                typeof(ICommandHandler <RollbackMessageCommand <long> >),
                typeof(DotNetWorkQueue.Transport.SQLite.Trace.Decorator.RollbackMessageCommandHandlerDecorator), LifeStyles.Singleton);

            //trace sending a message so that we can add specific tags
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <SendMessageCommand, long>),
                typeof(DotNetWorkQueue.Transport.SQLite.Trace.Decorator.SendMessageCommandHandlerDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutputAsync <SendMessageCommand, long>),
                typeof(DotNetWorkQueue.Transport.SQLite.Trace.Decorator.SendMessageCommandHandlerAsyncDecorator), LifeStyles.Singleton);
        }
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="queueConnection">Queue and connection information.</param>
 public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, QueueConnection queueConnection)
 {
     container.Register <ITransportCommitMessage, TransportCommitMessage>(LifeStyles.Singleton);
     container.Register <ITransportHandleMessage, TransportHandleMessage>(LifeStyles.Singleton);
 }
Пример #39
0
        /// <summary>
        /// Allows a transport to register its dependencies in the IoC container.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connection">The connection.</param>
        /// <param name="queue">The queue.</param>
        public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, string connection, string queue)
        {
            Guard.NotNull(() => container, container);

            //**all
            container.Register<IConnectionInformation>(() => new RedisConnectionInfo(queue, connection), LifeStyles.Singleton);
            container.Register<IQueueStatusProvider, RedisQueueStatusProvider>(LifeStyles.Singleton);
            container.Register<IJobSchedulerLastKnownEvent, RedisJobSchedulerLastKnownEvent>(LifeStyles.Singleton);
            container.Register<ISendJobToQueue, RedisSendJobToQueue>(LifeStyles.Singleton);

            container.Register<IJobTableCreation, RedisJobTableCreationNoOp>(LifeStyles.Singleton);

            container.Register<IQueueCreation, RedisQueueCreation>(LifeStyles.Singleton);
            container.Register<IRedisConnection, RedisConnection>(LifeStyles.Singleton);
            container.Register<RedisNames>(LifeStyles.Singleton);
            container.Register<RedisQueueTransportOptions>(LifeStyles.Singleton);
            container.Register<DelayedProcessingConfiguration>(LifeStyles.Singleton);
            container.Register<ICorrelationIdFactory, RedisQueueCorrelationIdFactory>(
                LifeStyles.Singleton);

            container.Register<ICreationScope, CreationScopeNoOp>(LifeStyles.Singleton);

            container.Register<IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTime>(LifeStyles.Singleton);
            container.Register<IGetTimeFactory, GetRedisTimeFactory>(LifeStyles.Singleton);

            container.Register<LuaScripts>(LifeStyles.Singleton);

            container.Register<IUnixTimeFactory, UnixTimeFactory>(LifeStyles.Singleton);
            
            container.Register<LocalMachineUnixTime>(LifeStyles.Singleton);
            container.Register<RedisServerUnixTime>(LifeStyles.Singleton);
            container.Register<SntpUnixTime>(LifeStyles.Singleton);

            container.Register<SntpTimeConfiguration>(LifeStyles.Singleton);
            container.Register<RedisHeaders>(LifeStyles.Singleton);
            container.Register<IClearExpiredMessages, RedisQueueClearExpiredMessages>(LifeStyles.Singleton);
            //**all

            //**send
            container.Register<ISendMessages, RedisQueueSend>(LifeStyles.Singleton);

            container.Register<CommitMessage>(LifeStyles.Singleton);
            container.Register<RollbackMessage>(LifeStyles.Singleton);
            container.Register<HandleMessage>(LifeStyles.Singleton);

            container.Register<IGetMessageIdFactory, GetMessageIdFactory>(LifeStyles.Singleton);
            container.Register<GetUuidMessageId>(LifeStyles.Singleton);
            container.Register<GetRedisIncrId>(LifeStyles.Singleton);

            container.Register<ISendBatchSize, RedisSimpleBatchSize>(LifeStyles.Singleton);
            //**send


            //**receive
            container.Register<IDelayedProcessingAction, DelayedProcessingAction>(LifeStyles.Singleton);
            container.Register<IQueueMonitor, RedisQueueMonitor>(LifeStyles.Singleton);

            container.Register<IReceiveMessages, RedisQueueReceiveMessages>(LifeStyles.Transient);

            container.Register<IDelayedProcessingMonitor, RedisDelayedProcessingMonitor>(LifeStyles.Singleton);
            container.Register<IResetHeartBeat, RedisQueueResetHeartBeat>(LifeStyles.Singleton);
            container.Register<ISendHeartBeat, RedisQueueSendHeartBeat>(LifeStyles.Singleton);
            container.Register<IReceiveMessagesFactory, ReceiveMessagesFactory>(LifeStyles.Singleton);
            container.Register<IReceivePoisonMessage, RedisQueueReceivePoisonMessage>(LifeStyles.Singleton);
            container.Register<IRedisQueueWorkSubFactory, RedisQueueWorkSubFactory>(LifeStyles.Singleton);
            container.Register<IReceiveMessagesError, RedisQueueReceiveMessagesError>(LifeStyles.Singleton);
            //**receive

            //commands
            var target = Assembly.GetAssembly(GetType());

            container.Register(typeof(ICommandHandlerWithOutput<,>), LifeStyles.Singleton,
                target);

            container.Register(typeof(ICommandHandler<>), LifeStyles.Singleton,
                target);

            container.Register(typeof(IQueryHandler<,>), LifeStyles.Singleton,
                target);

            //LUA scripts
            container.Register<DequeueLua>(LifeStyles.Singleton);
            container.Register<DequeueRpcLua>(LifeStyles.Singleton);
            container.Register<EnqueueLua>(LifeStyles.Singleton);
            container.Register<EnqueueDelayedLua>(LifeStyles.Singleton);
            container.Register<EnqueueExpirationLua>(LifeStyles.Singleton);
            container.Register<EnqueueDelayedAndExpirationLua>(LifeStyles.Singleton);
            container.Register<DeleteLua>(LifeStyles.Singleton);
            container.Register<RollbackLua>(LifeStyles.Singleton);
            container.Register<RollbackDelayLua>(LifeStyles.Singleton);
            container.Register<ErrorLua>(LifeStyles.Singleton);
            container.Register<MoveDelayedToPendingLua>(LifeStyles.Singleton);
            container.Register<SendHeartbeatLua>(LifeStyles.Singleton);
            container.Register<ClearExpiredMessagesLua>(LifeStyles.Singleton);
            container.Register<ResetHeartbeatLua>(LifeStyles.Singleton);
            container.Register<TimeLua>(LifeStyles.Singleton);
            container.Register<EnqueueBatchLua>(LifeStyles.Singleton);
            container.Register<CommitLua>(LifeStyles.Singleton);
            container.Register<DoesJobExistLua>(LifeStyles.Singleton);

            var types = target.GetTypes().Where(x => x.IsSubclassOf(typeof(BaseLua)));
            container.RegisterCollection<BaseLua>(types);

            //metric decorators
            container.RegisterDecorator<IDelayedProcessingAction, DelayedProcessingActionDecorator>(LifeStyles.Singleton);
            container.RegisterDecorator<IQueryHandler<ReceiveMessageQuery, RedisMessage>, ReceiveMessageQueryDecorator>(
                LifeStyles.Singleton);

            //logging decorators
            container.RegisterDecorator<IQueryHandler<ReceiveMessageQuery, RedisMessage>, Logging.Decorator.ReceiveMessageQueryDecorator>(
                LifeStyles.Singleton);
            container.RegisterDecorator<IDelayedProcessingAction, Logging.Decorator.DelayedProcessingActionDecorator>(LifeStyles.Singleton);
        }
Пример #40
0
        /// <inheritdoc />
        public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType,
                                                     QueueConnection queueConnection)
        {
            Guard.NotNull(() => container, container);
            base.RegisterImplementations(container, registrationType, queueConnection);

            var init = new RelationalDatabaseMessageQueueInit <long, Guid>();

            init.RegisterStandardImplementations(container, Assembly.GetAssembly(GetType()));

            //**all
            container.Register <IDbConnectionFactory, DbConnectionFactory>(LifeStyles.Singleton);
            container.Register <PostgreSqlMessageQueueSchema>(LifeStyles.Singleton);
            container.Register <IQueueCreation, PostgreSqlMessageQueueCreation>(LifeStyles.Singleton);
            container.Register <IJobSchedulerLastKnownEvent, PostgreSqlJobSchedulerLastKnownEvent>(LifeStyles.Singleton);
            container.Register <IOptionsSerialization, OptionsSerialization>(LifeStyles.Singleton);
            container.Register <PostgreSqlJobSchema>(LifeStyles.Singleton);
            container.Register <ISendJobToQueue, PostgreSqlSendJobToQueue>(LifeStyles.Singleton);
            container.Register <CommandStringCache, PostgreSqlCommandStringCache>(LifeStyles.Singleton);
            container.Register <IJobSchema, PostgreSqlJobSchema>(LifeStyles.Singleton);
            container.Register <IReadColumn, ReadColumn>(LifeStyles.Singleton);
            container.Register <ITransportOptionsFactory, TransportOptionsFactory>(LifeStyles.Singleton);
            container.Register <IGetPreviousMessageErrors, GetPreviousMessageErrors <long> >(LifeStyles.Singleton);

            container.Register <IRemoveMessage, RemoveMessage>(LifeStyles.Singleton);

            container.Register <IGetTime, PostgreSqlTime>(LifeStyles.Singleton);
            container.Register <IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTime>(LifeStyles.Singleton);
            container
            .Register
            <IPostgreSqlMessageQueueTransportOptionsFactory, PostgreSqlMessageQueueTransportOptionsFactory>(
                LifeStyles.Singleton);

            container.Register <PostgreSqlCommandStringCache>(LifeStyles.Singleton);
            container.Register <IConnectionInformation>(() => new SqlConnectionInformation(queueConnection),
                                                        LifeStyles.Singleton);

            container.Register <PostgreSqlMessageQueueTransportOptions>(LifeStyles.Singleton);
            container.Register <IConnectionHeader <NpgsqlConnection, NpgsqlTransaction, NpgsqlCommand>, ConnectionHeader <NpgsqlConnection, NpgsqlTransaction, NpgsqlCommand> >(LifeStyles.Singleton);
            //**all

            //**receive
            container.Register <IReceiveMessages, PostgreSqlMessageQueueReceive>(LifeStyles.Transient);
            container.Register <IConnectionHolderFactory <NpgsqlConnection, NpgsqlTransaction, NpgsqlCommand>, ConnectionHolderFactory>(LifeStyles.Singleton);
            container.Register <ITransportRollbackMessage, RollbackMessage>(LifeStyles.Singleton);
            container.Register <ReceiveMessage>(LifeStyles.Transient);
            container.Register <IBuildMoveToErrorQueueSql, BuildMoveToErrorQueueSql>(LifeStyles.Singleton);
            //**receive

            //reset heart beat
            container
            .Register <IPrepareCommandHandler <ResetHeartBeatCommand <long> >,
                       ResetHeartBeatCommandPrepareHandler>(LifeStyles.Singleton);

            //delete table - need lower case
            container
            .Register <IPrepareCommandHandler <DeleteTableCommand>,
                       DeleteTableCommandPrepareHandler>(LifeStyles.Singleton);

            //explicit registration of our job exists query
            container
            .Register <IQueryHandler <DoesJobExistQuery <NpgsqlConnection, NpgsqlTransaction>,
                                      QueueStatuses>,
                       DoesJobExistQueryHandler <NpgsqlConnection, NpgsqlTransaction> >(LifeStyles.Singleton);

            //because we have an explicit registration for job exists, we need to explicitly register the prepare statement
            container
            .Register <IPrepareQueryHandler <DoesJobExistQuery <NpgsqlConnection, NpgsqlTransaction>,
                                             QueueStatuses>,
                       DoesJobExistQueryPrepareHandler <NpgsqlConnection, NpgsqlTransaction> >(LifeStyles.Singleton);

            //expired messages
            container
            .Register <IPrepareQueryHandler <FindExpiredMessagesToDeleteQuery <long>, IEnumerable <long> >,
                       FindExpiredRecordsToDeleteQueryPrepareHandler>(LifeStyles.Singleton);

            //error messages
            container
            .Register <IPrepareQueryHandler <FindErrorMessagesToDeleteQuery <long>, IEnumerable <long> >,
                       FindErrorRecordsToDeleteQueryPrepareHandler>(LifeStyles.Singleton);

            //heartbeat
            container
            .Register <IPrepareQueryHandler <FindMessagesToResetByHeartBeatQuery <long>, IEnumerable <MessageToReset <long> > >,
                       FindRecordsToResetByHeartBeatQueryPrepareHandler>(LifeStyles.Singleton);

            container
            .Register <ICommandHandlerWithOutput <DeleteTransactionalMessageCommand, long>,
                       DeleteTransactionalMessageCommandHandler <NpgsqlConnection, NpgsqlTransaction, NpgsqlCommand> >(LifeStyles.Singleton);

            container
            .Register <ICommandHandler <MoveRecordToErrorQueueCommand <long> >,
                       MoveRecordToErrorQueueCommandHandler <NpgsqlConnection, NpgsqlTransaction, NpgsqlCommand> >(LifeStyles.Singleton);

            //explicit registration of options
            container
            .Register <IQueryHandler <GetQueueOptionsQuery <PostgreSqlMessageQueueTransportOptions>,
                                      PostgreSqlMessageQueueTransportOptions>,
                       GetQueueOptionsQueryHandler <PostgreSqlMessageQueueTransportOptions> >(LifeStyles.Singleton);

            container
            .Register <IPrepareQueryHandler <GetQueueOptionsQuery <PostgreSqlMessageQueueTransportOptions>,
                                             PostgreSqlMessageQueueTransportOptions>,
                       GetQueueOptionsQueryPrepareHandler <PostgreSqlMessageQueueTransportOptions> >(LifeStyles.Singleton);

            container.RegisterDecorator(typeof(IPrepareQueryHandler <GetColumnNamesFromTableQuery, List <string> >),
                                        typeof(GetColumnNamesFromTableQueryPrepareDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(IPrepareQueryHandler <GetTableExistsQuery, bool>),
                                        typeof(GetTableExistsQueryPrepareDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(IPrepareQueryHandler <GetTableExistsTransactionQuery, bool>),
                                        typeof(GetTableExistsTransactionQueryPrepareDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandlerWithOutput <,>),
                                        typeof(RetryCommandHandlerOutputDecorator <,>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandler <>),
                                        typeof(RetryCommandHandlerDecorator <>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandlerWithOutputAsync <,>),
                                        typeof(RetryCommandHandlerOutputDecoratorAsync <,>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(IQueryHandler <,>),
                                        typeof(RetryQueryHandlerDecorator <,>), LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateJobTablesCommand <ITable>, QueueCreationResult>),
                typeof(CreateJobTablesCommandDecorator), LifeStyles.Singleton);

            //register our decorator that handles table creation errors
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <CreateQueueTablesAndSaveConfigurationCommand <ITable>,
                                                  QueueCreationResult>),
                typeof(CreateQueueTablesAndSaveConfigurationDecorator), LifeStyles.Singleton);

            //trace fallback command
            container.RegisterDecorator(
                typeof(ICommandHandler <RollbackMessageCommand <long> >),
                typeof(DotNetWorkQueue.Transport.PostgreSQL.Trace.Decorator.RollbackMessageCommandHandlerDecorator), LifeStyles.Singleton);

            //trace sending a message so that we can add specific tags
            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutput <SendMessageCommand, long>),
                typeof(DotNetWorkQueue.Transport.PostgreSQL.Trace.Decorator.SendMessageCommandHandlerDecorator), LifeStyles.Singleton);

            container.RegisterDecorator(
                typeof(ICommandHandlerWithOutputAsync <SendMessageCommand, long>),
                typeof(DotNetWorkQueue.Transport.PostgreSQL.Trace.Decorator.SendMessageCommandHandlerAsyncDecorator), LifeStyles.Singleton);
        }
 /// <summary>
 /// Allows a transport to register its dependencies in the IoC container.
 /// </summary>
 /// <param name="container">The container.</param>
 /// <param name="registrationType">Type of the registration.</param>
 /// <param name="connection">The connection.</param>
 /// <param name="queue">The queue.</param>
 public abstract void RegisterImplementations(IContainer container, RegistrationTypes registrationType, string connection, string queue);
        /// <summary>
        /// Registers the implementations.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="registrationType">Type of the registration.</param>
        /// <param name="connection">The connection.</param>
        /// <param name="queue">The queue.</param>
        public override void RegisterImplementations(IContainer container, RegistrationTypes registrationType, string connection, string queue)
        {
            Guard.NotNull(() => container, container);

            //**all
            container.Register<PostgreSqlMessageQueueSchema>(LifeStyles.Singleton);
            container.Register<IQueueCreation, PostgreSqlMessageQueueCreation>(LifeStyles.Singleton);
            container.Register<PostgreSqlMessageQueueStatusQueries>(LifeStyles.Singleton);
            container.Register<IQueueStatusProvider, PostgreSqlQueueStatusProvider>(LifeStyles.Singleton);
            container.Register<IJobSchedulerLastKnownEvent, PostgreSqlJobSchedulerLastKnownEvent>(LifeStyles.Singleton);
            container.Register<IJobTableCreation, PostgreSqlJobTableCreation>(LifeStyles.Singleton);
            container.Register<PostgreSqlJobSchema>(LifeStyles.Singleton);
            container.Register<ISendJobToQueue, PostgreSqlSendJobToQueue>(LifeStyles.Singleton);
            container.Register<CreateJobMetaData>(LifeStyles.Singleton);

            container.Register<IGetTime, PostgreSqlTime>(LifeStyles.Singleton);
            container.Register<IGetFirstMessageDeliveryTime, GetFirstMessageDeliveryTime>(LifeStyles.Singleton);
            container
                .Register
                <IPostgreSqlMessageQueueTransportOptionsFactory, PostgreSqlMessageQueueTransportOptionsFactory>(
                    LifeStyles.Singleton);

            container.Register<ICreationScope, CreationScopeNoOp>(LifeStyles.Singleton);
            container.Register<PostgreSqlCommandStringCache>(LifeStyles.Singleton);

            container.Register<IConnectionInformation>(() => new SqlConnectionInformation(queue, connection), LifeStyles.Singleton);
            container.Register<ICorrelationIdFactory, PostgreSqlMessageQueueCorrelationIdFactory>(
                LifeStyles.Singleton);

            container.Register<PostgreSqlMessageQueueTransportOptions>(LifeStyles.Singleton);

            container.Register<TableNameHelper>(LifeStyles.Singleton);
            container.Register<SqlHeaders>(LifeStyles.Singleton);

            container.Register<ThreadSafeRandom>(LifeStyles.Singleton);
            container.Register<IClearExpiredMessages, PostgreSqlMessageQueueClearExpiredMessages>(LifeStyles.Singleton);
            //**all

            //**send
            container.Register<ISendMessages, PostgreSqlMessageQueueSend>(LifeStyles.Singleton);
            //**send


            //**receive
            container.Register<IReceiveMessages, PostgreSqlMessageQueueReceive>(LifeStyles.Transient);
            container.Register<IConnectionFactory, ConnectionFactory>(LifeStyles.Singleton);
            container.Register<CommitMessage>(LifeStyles.Transient);
            container.Register<RollbackMessage>(LifeStyles.Transient);
            container.Register<HandleMessage>(LifeStyles.Transient);
            container.Register<ReceiveMessage>(LifeStyles.Transient);

            container.Register<IResetHeartBeat, PostgreSqlMessageQueueResetHeartBeat>(LifeStyles.Singleton);
            container.Register<ISendHeartBeat, PostgreSqlMessageQueueSendHeartBeat>(LifeStyles.Singleton);
            container.Register<IReceiveMessagesFactory, ReceiveMessagesFactory>(LifeStyles.Singleton);
            container.Register<IReceivePoisonMessage, PostgreSqlQueueReceivePoisonMessage>(LifeStyles.Singleton);
            container.Register<IReceiveMessagesError, PostgreSqlMessageQueueReceiveErrorMessage>(LifeStyles.Singleton);
            //**receive

            var target = Assembly.GetAssembly(GetType());

            //commands and decorators
            // Go look in all assemblies and register all implementations
            // of ICommandHandlerWithOutput<T> by their closed interface:
            container.Register(typeof (ICommandHandlerWithOutput<,>), LifeStyles.Singleton,
                target);

            //commands and decorators
            // Go look in all assemblies and register all implementations
            // of ICommandHandlerWithOutputAsync<T> by their closed interface:
            container.Register(typeof(ICommandHandlerWithOutputAsync<,>), LifeStyles.Singleton,
                target);

            // Go look in all assemblies and register all implementations
            // of ICommandHandler<T> by their closed interface:
            container.Register(typeof (ICommandHandler<>), LifeStyles.Singleton,
                target);

            // Go look in all assemblies and register all implementations
            // of IQueryHandler<T> by their closed interface:
            container.Register(typeof (IQueryHandler<,>), LifeStyles.Singleton,
                target);

            container.RegisterDecorator(typeof (ICommandHandlerWithOutput<,>),
                typeof (RetryCommandHandlerOutputDecorator<,>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandler<>),
                typeof(RetryCommandHandlerDecorator<>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(ICommandHandlerWithOutputAsync<,>),
                typeof(RetryCommandHandlerOutputDecoratorAsync<,>), LifeStyles.Singleton);

            container.RegisterDecorator(typeof(IQueryHandler<,>),
               typeof(RetryQueryHandlerDecorator<,>), LifeStyles.Singleton);
        }