public SystemInformationDispatchingService(IAgentCoordinationServiceFactory agentCoordinationServiceFactory, IMessageQueueFeederFactory messageQueueFeederFactory, IMessageQueueWorkerFactory messageQueueWorkerFactory, IMessageQueueProvider <SystemInformation> messageQueueProvider, IMessageQueuePersistence <SystemInformation> messageQueuePersistence)
        {
            if (agentCoordinationServiceFactory == null)
            {
                throw new ArgumentNullException("agentCoordinationServiceFactory");
            }

            if (messageQueueFeederFactory == null)
            {
                throw new ArgumentNullException("messageQueueFeederFactory");
            }

            if (messageQueueWorkerFactory == null)
            {
                throw new ArgumentNullException("messageQueueWorkerFactory");
            }

            if (messageQueueProvider == null)
            {
                throw new ArgumentNullException("messageQueueProvider");
            }

            if (messageQueuePersistence == null)
            {
                throw new ArgumentNullException("messageQueuePersistence");
            }

            this.messageQueueFeeder      = messageQueueFeederFactory.GetMessageQueueFeeder();
            this.messageQueueWorker      = messageQueueWorkerFactory.GetMessageQueueWorker();
            this.messageQueueProvider    = messageQueueProvider;
            this.messageQueuePersistence = messageQueuePersistence;

            this.agentCoordinationService = agentCoordinationServiceFactory.GetAgentCoordinationService(
                () => this.messageQueueWorker.Pause(), () => this.messageQueueWorker.Resume());
        }
        public SystemInformationDispatchingService(IAgentCoordinationServiceFactory agentCoordinationServiceFactory, IMessageQueueFeederFactory messageQueueFeederFactory, IMessageQueueWorkerFactory messageQueueWorkerFactory, IMessageQueueProvider<SystemInformation> messageQueueProvider, IMessageQueuePersistence<SystemInformation> messageQueuePersistence)
        {
            if (agentCoordinationServiceFactory == null)
            {
                throw new ArgumentNullException("agentCoordinationServiceFactory");
            }

            if (messageQueueFeederFactory == null)
            {
                throw new ArgumentNullException("messageQueueFeederFactory");
            }

            if (messageQueueWorkerFactory == null)
            {
                throw new ArgumentNullException("messageQueueWorkerFactory");
            }

            if (messageQueueProvider == null)
            {
                throw new ArgumentNullException("messageQueueProvider");
            }

            if (messageQueuePersistence == null)
            {
                throw new ArgumentNullException("messageQueuePersistence");
            }

            this.messageQueueFeeder = messageQueueFeederFactory.GetMessageQueueFeeder();
            this.messageQueueWorker = messageQueueWorkerFactory.GetMessageQueueWorker();
            this.messageQueueProvider = messageQueueProvider;
            this.messageQueuePersistence = messageQueuePersistence;

            this.agentCoordinationService = agentCoordinationServiceFactory.GetAgentCoordinationService(
                () => this.messageQueueWorker.Pause(), () => this.messageQueueWorker.Resume());
        }
        /// <summary>
        /// Зарегистрировать рабочий поток очереди сообщений.
        /// </summary>
        /// <param name="queueName">Наименование очереди сообщений.</param>
        /// <param name="queueWorker">Интерфейс для управления рабочим потоком очереди сообщений.</param>
        /// <exception cref="ArgumentNullException"></exception>
        public void RegisterWorker(string queueName, IMessageQueueWorker queueWorker)
        {
            ForWorker(queueName, previousQueueWorker =>
            {
                if (previousQueueWorker != null)
                {
                    previousQueueWorker.ExecuteSilent(w => w.Stop());
                }

                _queueWorkers[queueName] = queueWorker;
            },
                      ifExists: false);
        }