/// <summary>
        /// Остановить Бекграунд транспорта
        /// </summary>
        /// <param name="keyTransport"></param>
        public async Task StopBackground(KeyTransport keyTransport)
        {
            var bg = _mediatorForStorages.GetBackground(keyTransport);

            if (!bg.IsStarted)
            {
                throw new ActionHandlerException($"Бекграунд и так остановлен: {bg.KeyTransport}");
            }

            await bg.StopAsync(CancellationToken.None);
        }
Пример #2
0
        /// <summary>
        /// Проверка наличия транспорта по ключу
        /// </summary>
        public async Task <bool> IsExistTransportAsync(KeyTransport keyTransport)
        {
            switch (keyTransport.TransportType)
            {
            case TransportType.SerialPort:
                return(await _serialPortOptionRep.IsExistAsync(sp => sp.Port == keyTransport.Key));

            case TransportType.TcpIp:
                return(await _tcpIpOptionRep.IsExistAsync(tcpip => tcpip.Name == keyTransport.Key));

            case TransportType.Http:
                return(await _httpOptionRep.IsExistAsync(http => http.Name == keyTransport.Key));
            }

            return(false);
        }
Пример #3
0
        /// <summary>
        /// Ищет транспорт по ключу в нужном хранилище и Удаляет его.
        /// </summary>
        private async Task RemoveAndStopTransport(KeyTransport keyTransport)
        {
            var bg = _backgroundStorageService.Get(keyTransport);

            if (bg.IsStarted)
            {
                _backgroundStorageService.Remove(keyTransport);
                await bg.StopAsync(CancellationToken.None);

                bg.Dispose();
            }

            var transport = _transportStorageService.Get(keyTransport);

            if (transport.IsCycleReopened)
            {
                transport.CycleReOpenedCancelation();
            }
            _transportStorageService.Remove(keyTransport);
            transport.Dispose();
        }
Пример #4
0
        /// <summary>
        /// Ищет транспорт по ключу в нужном репозитории и Удаляет его.
        /// Удаленный транспорт помещается в deletedTransport.
        /// </summary>
        private async Task RemoveTransportAsync(KeyTransport keyTransport, TransportOption deletedTransport)
        {
            switch (keyTransport.TransportType)
            {
            case TransportType.SerialPort:
                deletedTransport.SerialOptions.Add(await _serialPortOptionRep.GetSingleAsync(sp => sp.Port == keyTransport.Key));
                await _serialPortOptionRep.DeleteAsync(sp => sp.Port == keyTransport.Key);

                break;

            case TransportType.TcpIp:
                deletedTransport.TcpIpOptions.Add(await _tcpIpOptionRep.GetSingleAsync(tcpip => tcpip.Name == keyTransport.Key));
                await _tcpIpOptionRep.DeleteAsync(tcpip => tcpip.Name == keyTransport.Key);

                break;

            case TransportType.Http:
                deletedTransport.HttpOptions.Add(await _httpOptionRep.GetSingleAsync(http => http.Name == keyTransport.Key));
                await _httpOptionRep.DeleteAsync(http => http.Name == keyTransport.Key);

                break;
            }
        }
 public HostingBackgroundTransport(KeyTransport keyTransport, bool autoStart) : base(autoStart)
 {
     KeyTransport = keyTransport;
 }
Пример #6
0
        /// <summary>
        /// Создать устройство на базе optionAgregator.
        /// Созданное ус-во добавляется в StorageDevice.
        /// Если для создания ус-ва нужно создать ОБМЕН и/или ТРАНСПОРТ, то созданные объекты тоже добавляются в StorageExchange или StorageTransport
        /// </summary>
        /// <param name="optionAgregator">Цепочка настроек одного устройства. Настройкам этим полностью доверяем (не валидируем).</param>
        /// <returns> Новое созданное ус-во, добавленное в хранилище</returns>
        public Device <TIn> BuildAndAddDevice(OptionAgregator optionAgregator)
        {
            var deviceOption = optionAgregator.DeviceOptions.First();

            if (_deviceStorageService.IsExist(deviceOption.Name))
            {
                throw new StorageHandlerException($"Устройство с таким именем уже существует: {deviceOption.Name}");
            }

            //ДОБАВИТЬ НОВЫЙ ТРАНСПОРТ-----------------------------------------------------------------------
            foreach (var spOption in optionAgregator.TransportOptions.SerialOptions)
            {
                var keyTransport = new KeyTransport(spOption.Port, TransportType.SerialPort);
                var sp           = _transportStorageService.Get(keyTransport);
                if (sp == null)
                {
                    sp = new SpWinSystemIo(spOption, keyTransport);
                    _transportStorageService.AddNew(keyTransport, sp);
                    var bg = new HostingBackgroundTransport(keyTransport, spOption.AutoStart);
                    _backgroundStorageService.AddNew(keyTransport, bg);
                }
            }
            foreach (var tcpIpOption in optionAgregator.TransportOptions.TcpIpOptions)
            {
                var keyTransport = new KeyTransport(tcpIpOption.Name, TransportType.TcpIp);
                var tcpIp        = _transportStorageService.Get(keyTransport);
                if (tcpIp == null)
                {
                    tcpIp = new TcpIpTransport(tcpIpOption, keyTransport, _logger);
                    _transportStorageService.AddNew(keyTransport, tcpIp);
                    var bg = new HostingBackgroundTransport(keyTransport, tcpIpOption.AutoStart);
                    _backgroundStorageService.AddNew(keyTransport, bg);
                }
            }
            foreach (var httpOption in optionAgregator.TransportOptions.HttpOptions)
            {
                var keyTransport = new KeyTransport(httpOption.Name, TransportType.Http);
                var http         = _transportStorageService.Get(keyTransport);
                if (http == null)
                {
                    http = new HttpTransport(httpOption, keyTransport);
                    _transportStorageService.AddNew(keyTransport, http);
                    var bg = new HostingBackgroundTransport(keyTransport, httpOption.AutoStart);
                    _backgroundStorageService.AddNew(keyTransport, bg);
                }
            }

            //ДОБАВИТЬ НОВЫЕ ОБМЕНЫ---------------------------------------------------------------------------
            foreach (var exchOption in optionAgregator.ExchangeOptions)
            {
                var exch = _exchangeStorageService.Get(exchOption.Key);
                if (exch != null)
                {
                    continue;
                }

                var keyTransport = exchOption.KeyTransport;
                var bg           = _backgroundStorageService.Get(keyTransport);
                var transport    = _transportStorageService.Get(keyTransport);

                try
                {
                    var dataProvider = _dataProviderFactory[exchOption.Provider.Name](exchOption.Provider);
                    exch = new ExchangeUniversal <TIn>(exchOption, transport, bg, dataProvider, _logger);
                    _exchangeStorageService.AddNew(exchOption.Key, exch);
                }
                catch (Exception)
                {
                    throw new StorageHandlerException($"Провайдер данных не найденн в системе: {exchOption.Provider.Name}");
                }
            }

            //ДОБАВИТЬ УСТРОЙСТВО--------------------------------------------------------------------------
            var excanges = _exchangeStorageService.GetMany(deviceOption.ExchangeKeys).ToList();
            var device   = new Device <TIn>(deviceOption, excanges, _eventBus, _produser4DeviceRespFactory, _appConfigWrapper.GetProduser4DeviceOption, _logger);

            _deviceStorageService.AddNew(device.Option.Name, device);

            return(device);
        }
Пример #7
0
 public ITransportBackground GetBackground(KeyTransport keyTransport)
 {
     return(_backgroundStorageService.Get(keyTransport));
 }
 public HttpTransport(HttpOption option, KeyTransport keyTransport)
 {
     KeyTransport = keyTransport;
     Option       = option;
 }