示例#1
0
        public virtual async Task <IEnumerable <ShoppingCart> > GetByIdsAsync(string[] cartIds, string responseGroup = null)
        {
            var retVal   = new List <ShoppingCart>();
            var cacheKey = CacheKey.With(GetType(), "GetByIdsAsync", string.Join("-", cartIds), responseGroup);

            return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) =>
            {
                using (var repository = _repositoryFactory())
                {
                    //Disable DBContext change tracking for better performance
                    repository.DisableChangesTracking();

                    var cartEntities = await repository.GetShoppingCartsByIdsAsync(cartIds, responseGroup);
                    foreach (var cartEntity in cartEntities)
                    {
                        var cart = cartEntity.ToModel(AbstractTypeFactory <ShoppingCart> .TryCreateInstance());
                        //Calculate totals only for full responseGroup
                        if (responseGroup == null)
                        {
                            _totalsCalculator.CalculateTotals(cart);
                        }
                        retVal.Add(cart);
                        cacheEntry.AddExpirationToken(CartCacheRegion.CreateChangeToken(cart));
                    }
                }

                await _dynamicPropertyService.LoadDynamicPropertyValuesAsync(retVal.ToArray <IHasDynamicProperties>());

                return retVal;
            }));
        }
示例#2
0
        public virtual async Task <ShoppingCart[]> GetByIdsAsync(string[] cartIds, string responseGroup = null)
        {
            var retVal   = new List <ShoppingCart>();
            var cacheKey = CacheKey.With(GetType(), "GetByIdsAsync", string.Join("-", cartIds), responseGroup);
            var result   = await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) =>
            {
                using (var repository = _repositoryFactory())
                {
                    //Disable DBContext change tracking for better performance
                    repository.DisableChangesTracking();
                    cacheEntry.AddExpirationToken(CartCacheRegion.CreateChangeToken(cartIds));

                    var cartEntities = await repository.GetShoppingCartsByIdsAsync(cartIds, responseGroup);
                    foreach (var cartEntity in cartEntities)
                    {
                        var cart = cartEntity.ToModel(AbstractTypeFactory <ShoppingCart> .TryCreateInstance());
                        //Calculate totals only for full responseGroup
                        if (responseGroup == null)
                        {
                            _totalsCalculator.CalculateTotals(cart);
                        }
                        cart.ReduceDetails(responseGroup);

                        retVal.Add(cart);
                    }
                }
                return(retVal);
            });

            return(result.Select(x => x.Clone() as ShoppingCart).ToArray());
        }
        public virtual async Task <CartAggregate> RecalculateAsync()
        {
            EnsureCartExists();

            var promotionEvalResult = await EvaluatePromotionsAsync();

            Cart.ApplyRewards(promotionEvalResult.Rewards);

            var taxRates = await EvaluateTaxesAsync();

            Cart.ApplyTaxRates(taxRates);

            _cartTotalsCalculator.CalculateTotals(Cart);
            return(this);
        }
 public ActionResult <ShoppingCart> RecalculateTotals([FromBody] ShoppingCart cart)
 {
     _cartTotalsCalculator.CalculateTotals(cart);
     return(Ok(cart));
 }