private void Produce(IProduce produce, ICargoContainer container)
        {
            if (produce == null)
            {
                throw new ArgumentNullException(nameof(produce));
            }

            if (!produce.From.Any() && !produce.To.Any())
            {
                return;
            }

            //проверяем, что ингридиентов достаточно, чтобы приготовить
            foreach (var cargoFrom in produce.From)
            {
                var fromCargo = container.Cargos.Collection.FirstOrDefault(c => c.Type == cargoFrom.Type);

                if (fromCargo == null)
                {
                    return;
                }

                if (fromCargo.Count < cargoFrom.Count * produce.Speed)
                {
                    return;
                }
            }

            //проверяем, что место достаточно, чтобы хранить ингридиенты
            foreach (var cargoTo in produce.To)
            {
                var count = cargoTo.Count * produce.Speed;
                if (count > CanAddCargoMore(cargoTo.Type, container))
                {
                    return;
                }
            }

            //тратим ингридиенты
            foreach (var cargoFrom in produce.From)
            {
                var fromCargo = container.Cargos.Collection.First(c => c.Type == cargoFrom.Type);
                fromCargo.Count -= cargoFrom.Count * produce.Speed;
            }

            //создаем ингридиенты
            foreach (var cargoTo in produce.To)
            {
                var cargoToAdd = NewInstanceFactory.GetNewInstance <ICargo>(cargoTo.Type);


                cargoToAdd.Count = cargoTo.Count * produce.Speed;

                AddCargo(cargoToAdd, container);
            }
        }
Exemple #2
0
 public static void Attach <T>(this IProduce <T> producer, Action <T> consumer)
 {
     producer.Attach(new ActionConsumer <T>(consumer));
 }