/// <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); }
/// <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); }
/// <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(); }
/// <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; }
/// <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); }
public ITransportBackground GetBackground(KeyTransport keyTransport) { return(_backgroundStorageService.Get(keyTransport)); }
public HttpTransport(HttpOption option, KeyTransport keyTransport) { KeyTransport = keyTransport; Option = option; }