Пример #1
0
        public event Action FinishWork;                                 //работа магазина окончена

        public PetShop()
        {
            PurchaseQueue    = new Queue <Purchase>();
            PurchaseCreation = new PurchaseQueueCreation(PurchaseQueue);
            DepartmentChain  = CreateDepartments();
            Cart             = new ShoppingCart(DepartmentChain, PurchaseQueue);
            //подключаем обработчики событий добавления покупки в корзину (откуда она пойдет в отделы),
            //откладывания покупки (если отдел занят) и окончания работы магазина
            Cart.PurchaseInProcess += purchase => PurchaseToDep?.Invoke(purchase);
            Cart.PostponePurchase  += purchase => PostponePurchase?.Invoke(purchase);
            Cart.FinishWork        += () => FinishWork?.Invoke();
            //подключаем обработчики событий добавления/откладывания (если доставщик занят)/изменений на складе/доставки покупки для отделов
            PurchaseCreation.AddPurchase += purchase => NewPurchase?.Invoke(purchase);
            DepartmentChain.AddStockChanges(department => StockChanges?.Invoke(department));
            DepartmentChain.AddContractionAction((purchase, contractor) => ContractionFinished?.Invoke(purchase, contractor));
            DepartmentChain.AddDeliveryAtion((purchase, deliverer) => DeliveryFinished?.Invoke(purchase, deliverer));
        }
Пример #2
0
 //процесс рассмотрения покупки и отправки ее в соответствующий отдел (если это возможно)
 private void TrySendPurchase(SynchronizationContext context)
 {
     lock (Purchases)
     {
         if (Purchases.Count != 0)   //если заявки есть, то первую в очереди пытаемся отправить в отдел
         {
             var purchase = Purchases.Dequeue();
             //дальше смотрим: если отдел не занят продажей, направляем туда, иначе откладываем
             if (ShoppingDepartments.HandlePurchase(purchase, context))
             {
                 context.Send(obj => PurchaseInProcess?.Invoke(obj as Purchase), purchase);
             }
             else
             {
                 context.Send(obj => PostponePurchase?.Invoke(obj as Purchase), purchase);
                 Purchases.Enqueue(purchase);
             }
         }
         return;
     }
 }