/// <summary> /// Удалим устройство. /// Если ключ обмена уникален, то удалим обмен, если в удаляемом обмене уникальный транспорт, то удалим транспорт. /// </summary> /// <returns>Возвращает все удаленные объекты (Device + Exchanges + Transport)</returns> public async Task <OptionAgregator> RemoveDeviceOptionAsync(DeviceOption deviceOption) { var deletedOptions = new OptionAgregator { ExchangeOptions = new List <ExchangeOption>(), DeviceOptions = new List <DeviceOption>(), TransportOptions = new TransportOption { TcpIpOptions = new List <TcpIpOption>(), SerialOptions = new List <SerialOption>(), HttpOptions = new List <HttpOption>() } }; //ПРОВЕРКА УНИКАЛЬНОСТИ ОБМЕНОВ УДАЛЯЕМОГО УСТРОЙСТВА (ЕСЛИ УНИКАЛЬНО ТО УДАЛЯЕМ И ОБМЕН, ЕСЛИ ОБМЕН ИСПОЛЬУЕТ УНИКАЛЬНЫЙ ТРАНСПОРТ, ТО УДАЛЯЕМ И ТРАНСПОРТ) var exchangeKeys = (await _deviceOptionRep.ListAsync()).SelectMany(option => option.ExchangeKeys).ToList(); //ключи обменов со всех устройств. foreach (var exchangeKey in deviceOption.ExchangeKeys) { if (exchangeKeys.Count(key => key == exchangeKey) == 1) //найден обмен используемый только этим устройством { var singleExchOption = await _exchangeOptionRep.GetSingleAsync(exc => exc.Key == exchangeKey); if ((await _exchangeOptionRep.ListAsync()).Count(option => option.KeyTransport.Equals(singleExchOption.KeyTransport)) == 1) //найденн транспорт используемый только этим (удаленным) обменом { await RemoveTransportAsync(singleExchOption.KeyTransport, deletedOptions.TransportOptions); //Удалить транспорт } deletedOptions.ExchangeOptions.Add(singleExchOption); await _exchangeOptionRep.DeleteAsync(singleExchOption); //Удалить обмен } } //УДАЛИМ УСТРОЙСТВО deletedOptions.DeviceOptions.Add(deviceOption); await _deviceOptionRep.DeleteAsync(deviceOption); return(deletedOptions); }
/// <summary> /// Найти Device и все его зависимости в репоизиториях. /// Вернуть найденное под OptionAgregator. /// </summary> public async Task <OptionAgregator> GetOptionAgregatorForDeviceAsync(string deviceName) { var deviceOption = await GetDeviceOptionByNameAsync(deviceName); if (deviceOption == null) { throw new OptionHandlerException($"Устройство с таким именем Не найденно: {deviceName}"); } var exchangesOptions = deviceOption.ExchangeKeys.Select(exchangeKey => GetExchangeByKeyAsync(exchangeKey).GetAwaiter().GetResult()).ToList(); var transportOption = await GetTransportByKeysAsync(exchangesOptions.Select(option => option.KeyTransport).Distinct()); var optionAgregator = new OptionAgregator { DeviceOptions = new List <DeviceOption> { deviceOption }, ExchangeOptions = exchangesOptions, TransportOptions = transportOption }; return(optionAgregator); }
/// <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); }