예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
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);
        }