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)); }
//процесс рассмотрения покупки и отправки ее в соответствующий отдел (если это возможно) 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; } }