示例#1
0
        public CurrencyConverter Create(CurrencyConversion conversion)
        {
            var rates = _exchangeRateRepository.GetActualForExchange(conversion.ExchangeRateKey);

            if (rates.Count == 0)
            {
                var message = string.Format("Conversion {0} is not supported.", conversion);
                throw new NotSupportedException(message);
            }
            if (rates.Count == 1)
            {
                return(rates[0].Converter);
            }
            var rate = rates.OrderBy(x => _settings.GetPriority(x.Base.ISOName)).First();

            return(rate.Converter);
        }
        public void UpdateRates()
        {
            var nationalBankClient = new NBRBServiceClient();

            try
            {
                var now               = DateTime.UtcNow;
                var currencies        = _deps.Currencies.FindAll();
                var nationalCurrency  = currencies.First(x => x.ISOName == _settings.NationalCurrency);
                var foreignCurrencies = currencies.Except(new[] { nationalCurrency }).ToList();

                var nationalBankRates = nationalBankClient.GetLatestRates()
                                        .Where(x => foreignCurrencies.Any(f => f.ISOName == x.Conversion.To))
                                        .ToList();
                var commercialRates = nationalBankRates
                                      .Select(x => _deps.ExchangeRateCalculator.CalculateFromNationalBankRate(x.Conversion.To, x.Rate, now))
                                      .ToDictionary(x => x.Foreign.ISOName, x => x);

                var foreignCurrenciesIds = foreignCurrencies.Select(x => x.ISOName).ToList();
                var pairs = from id1 in foreignCurrenciesIds
                            from id2 in foreignCurrenciesIds
                            select new { id1, id2 };
                var crossConversions = pairs.Where(x => x.id1 != x.id2)
                                       .Select(x => new CurrencyConversion(x.id1, x.id2))
                                       .OrderBy(x => _settings.GetPriority(x.From))
                                       .DistinctBy(x => x.ExchangeRateKey)
                                       .ToList();
                var crossRates = crossConversions
                                 .Select(x => _deps.ExchangeRateCalculator.CalculateCrossRate(commercialRates[x.From], commercialRates[x.To], now))
                                 .ToList();

                var allRates = commercialRates.Values.Concat(crossRates).ToList();
                allRates.ForEach(_deps.ExchangeRates.Save);
                Commit();
            }
            catch (Exception ex)
            {
                throw new ServiceException("Can't update currency rates.", ex);
            }
            finally
            {
                nationalBankClient.Dispose();
            }
        }