public RestaurantProcessStorage(
     Handles <Messages.PrepareFood> kitchen, AssistantManager assistantManager, Cashier cashier,
     EnterpriseExcel reporting, AlarmClock alarmClock)
 {
     this.assistantManager = assistantManager;
     this.reporting        = reporting;
     this.alarmClock       = alarmClock;
     this.cashier          = cashier;
     this.kitchen          = kitchen;
 }
Example #2
0
        private static void PayLoop(Cashier cashier)
        {
            var outstandingOrders = new Queue <int>(Enumerable.Range(0, 100000));

            while (outstandingOrders.Count > 0)
            {
                var nextOrder = outstandingOrders.Dequeue();
                if (false == cashier.TryAcceptPayment(nextOrder))
                {
                    outstandingOrders.Enqueue(nextOrder);
                }
            }
        }
Example #3
0
        public static void Main(string[] args)
        {
            var dispatcher = new Dispatcher();

            var cooks = new[]
            {
                new QueuedHandler <Messages.PrepareFood>(
                    new Chef(dispatcher, "Joe Bastianich", 1)),
                new QueuedHandler <Messages.PrepareFood>(
                    new Chef(dispatcher, "Gordon Ramsay", 3)),
                new QueuedHandler <Messages.PrepareFood>(
                    new KitchenNightmare(new Chef(dispatcher, "Amy's Baking Company", .5)))
            };
            var kitchenQueue = new QueuedHandler <Messages.PrepareFood>(
                new TimeToLiveHandler <Messages.PrepareFood>(
                    new ShortestQueueDispatcher <Messages.PrepareFood>(cooks)));

            kitchenQueue.Start();

            var kitchen = new ThrottlingHandler <Messages.PrepareFood>(kitchenQueue);

            var assistantManager = new AssistantManager(dispatcher);

            var cashier = new Cashier(dispatcher);

            var reporting = new EnterpriseExcel();


            var alarmClock = new AlarmClock(dispatcher);

            alarmClock.Start();

            var storage = new RestaurantProcessStorage(kitchen, assistantManager, cashier, reporting, alarmClock);
            var waiter  = new Waiter("July M.", dispatcher);


            dispatcher.Subscribe(Log <Messages.OrderPlaced>(dispatcher));
            dispatcher.Subscribe(Log <Messages.SuspectOrderPlaced>(dispatcher));

            dispatcher.Subscribe <Messages.OrderPlaced>(storage);
            dispatcher.Subscribe <Messages.SuspectOrderPlaced>(storage);
            dispatcher.Subscribe <Messages.PrepareFood>(storage);
            dispatcher.Subscribe <Messages.FoodPrepared>(storage);
            dispatcher.Subscribe <Messages.TotalOrder>(storage);
            dispatcher.Subscribe <Messages.OrderTotalled>(storage);
            dispatcher.Subscribe <Messages.OrderPaid>(storage);
            dispatcher.Subscribe <Messages.ProcessCompleted>(storage);
            dispatcher.Subscribe <Messages.Timeout <Message> >(alarmClock);

            new Thread(
                _ => PayLoop(cashier)).Start();

            cooks.ForEach(x => x.Start());
            var plates = new[] { "Pizza", "Chicharron", "Miguitas" };

            for (var i = 0; i < 100000; i++)
            {
                waiter.PlaceOrder(i, 1, new Order.Item(plates[i % 3], 1));
            }

            Console.ReadLine();
        }