public double GetTotal() { List <Type> priceCaluclatorImplementations = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()) .Where(x => typeof(ProductPriceCalculatorDec).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract).ToList(); IProductPriceCalculator priceCalculator = new PriceCalculator(Items); priceCalculator.CalculatePrice(); foreach (var implementation in priceCaluclatorImplementations) { priceCalculator = (IProductPriceCalculator)Activator.CreateInstance(implementation, new object[] { priceCalculator }); priceCalculator.CalculatePrice(); } _logger.Info(new { ItemsInfo = priceCalculator.Items, AppliedDiscounts = priceCalculator.GetAppliedDiscounts() }); return(priceCalculator.GetTotal()); }