private static WireUpResult WireUp(TopicBasedPubSub topicBasedPubSub)
        {
            var horn = PrintDetails ? (IHorn) new ConsoleHorn() : new SilentHorn();

            var cookNames = new[]
            {
                "Joe",
                "Greg",
                "Bro"
            };
            var printer = new Printer(horn);

            var cashier = AsQueueable(nameof(Cashier), new Cashier(topicBasedPubSub, horn));

            var assistantManager = AsQueueable(nameof(AssistantManager), new AssistantManager(topicBasedPubSub, horn));

            var random = new Random();
            var cooks  = cookNames
                         .Select(
                cookName =>
                AsQueueable($"{nameof(Cook)}-{cookName}",
                            new DroppingHandler <CookFood>(new Cook(topicBasedPubSub, horn, cookName, random.Next(0, 10000)))))
                         .ToList();

            var megaCook = AsQueueable("CookDispatcher", new MoreFairDispatcher <CookFood>(cooks));

            var waiter = new Waiter(topicBasedPubSub, horn);

            topicBasedPubSub.SubscribeByType <PrintReceipt>(printer);
            topicBasedPubSub.SubscribeByType <TakePayment>(cashier);
            topicBasedPubSub.SubscribeByType <PriceOrder>(assistantManager);
            topicBasedPubSub.SubscribeByType <CookFood>(megaCook);

            var midgetHouse = AsQueueable(nameof(MidgetHouse), new MidgetHouse(topicBasedPubSub));

            var items = cooks.Concat(new object[]
            {
                megaCook,
                cashier,
                assistantManager,
                midgetHouse
            }).ToList();

            var statsProjection = new StatsProjection();

            topicBasedPubSub.SubscribeByType <OrderPlaced>(statsProjection);
            topicBasedPubSub.SubscribeByType <OrderFinalized>(statsProjection);

            return(new WireUpResult
            {
                Waiter = waiter,
                Startables = items
                             .Cast <IStartable>()
                             .ToList(),
                Trackables = items
                             .Cast <ITrackable>()
                             .ToList(),
                MidgetHouse = midgetHouse,
                StatsProjection = statsProjection
            });
        }
Пример #2
0
        public static void SeedData()
        {
            restaurantsContext db = new restaurantsContext();

            //************INSERT RESTAURANTS***********
            var        restaurant = db.Restaurant;
            Restaurant kaspers    = new Restaurant()
            {
                AddressRes = "Lillegade",
                NameRes    = "Kaspers Bofhus",
                Type       = "Bofhus"
            };

            db.Add(kaspers);

            Restaurant jensens = new Restaurant()
            {
                AddressRes = "Rosenkrantzgade",
                NameRes    = "Jensens Bofhus",
                Type       = "Bofhus"
            };

            db.Add(jensens);

            Restaurant fiskens = new Restaurant()
            {
                AddressRes = "Fiskehusvej",
                NameRes    = "Thanks For All the Fisk",
                Type       = "Fisk"
            };

            db.Add(fiskens);

            db.SaveChanges();


            //************INSERT DISHES*****************
            var dish = db.Dish;

            // Lillegade *******************************
            Dish bof = new Dish()
            {
                DishName        = "Bof",
                DishDescription = "Den lækreste bof i huset",
                Price           = 199,
                Category        = "Bof",
                AddressRes      = "Lillegade"
            };

            db.Add(bof);

            Dish megabof = new Dish()
            {
                DishName        = "MEGA Bof",
                DishDescription = "Den lækreste MEGA bof i huset",
                Price           = 259,
                Category        = "Bof",
                AddressRes      = "Lillegade"
            };

            db.Add(megabof);

            Dish minibof = new Dish()
            {
                DishName        = "mini Bof",
                DishDescription = "Den lækreste mini bof i huset",
                Price           = 129,
                Category        = "Bof",
                AddressRes      = "Lillegade"
            };

            db.Add(minibof);

            // Rosenkrantzgade *************************
            Dish salatbar = new Dish()
            {
                DishName        = "Salatbar",
                DishDescription = "Tag selv salatbar - all you can eat",
                Price           = 49,
                Category        = "Salat",
                AddressRes      = "Rosenkrantzgade"
            };

            db.Add(salatbar);

            Dish nachos = new Dish()
            {
                DishName        = "Nachos",
                DishDescription = "Sprode tortillachips med ched ­dar og jalapeños. Serveres med guacamole, salsa og creme fraiche",
                Price           = 69,
                Category        = "Frokost",
                AddressRes      = "Rosenkrantzgade"
            };

            db.Add(nachos);

            Dish hakkebof = new Dish()
            {
                DishName        = "Herregårds-hakkebof",
                DishDescription = "Hakkebof serveres med lune ærter, tykke fries og Jensens Bearnaisesauce",
                Price           = 79,
                Category        = "Frokost",
                AddressRes      = "Rosenkrantzgade"
            };

            db.Add(hakkebof);

            // Fiskehusvej *****************************
            Dish rogn = new Dish()
            {
                DishName        = "Stenbiderrogn",
                DishDescription = "Yummmm lidt æg til vinen",
                Price           = 110,
                Category        = "Fisk",
                AddressRes      = "Fiskehusvej"
            };

            db.Add(rogn);

            Dish deller = new Dish()
            {
                DishName        = "Fiskefrikadeller",
                DishDescription = "Dejlig saftige fiskefrikedeller af den bedste torsk fra Gudenåen",
                Price           = 150,
                Category        = "Fisk",
                AddressRes      = "Fiskehusvej"
            };

            db.Add(deller);

            //************INSERT TABLES****************
            var table = db.TableRes;

            // Lillegade *******************************
            var bord1 = new TableRes()
            {
                TableNumber = 1,
                Chairs      = 2,
                AddressRes  = "Lillegade"
            };

            db.Add(bord1);

            var bord2 = new TableRes()
            {
                TableNumber = 2,
                Chairs      = 4,
                AddressRes  = "Lillegade"
            };

            db.Add(bord2);

            var bord3 = new TableRes()
            {
                TableNumber = 3,
                Chairs      = 4,
                AddressRes  = "Lillegade"
            };

            db.Add(bord3);

            // Rosenkrantzgade *************************
            var bord4 = new TableRes()
            {
                TableNumber = 4,
                Chairs      = 4,
                AddressRes  = "Rosenkrantzgade"
            };

            db.Add(bord4);

            var bord5 = new TableRes()
            {
                TableNumber = 5,
                Chairs      = 4,
                AddressRes  = "Rosenkrantzgade"
            };

            db.Add(bord5);

            // Fiskehusvej *****************************
            var bord6 = new TableRes()
            {
                TableNumber = 6,
                Chairs      = 6,
                AddressRes  = "Fiskehusvej"
            };

            db.Add(bord6);

            var bord7 = new TableRes()
            {
                TableNumber = 7,
                Chairs      = 2,
                AddressRes  = "Fiskehusvej"
            };

            db.Add(bord7);

            var bord8 = new TableRes()
            {
                TableNumber = 8,
                Chairs      = 4,
                AddressRes  = "Fiskehusvej"
            };

            db.Add(bord8);

            //************INSERT WAITERS**************

            var waiter  = db.Waiter;
            var tjener1 = new Waiter()
            {
                Salary     = 120000,
                AddressRes = "Lillegade"
            };

            db.Add(tjener1);

            var tjener2 = new Waiter()
            {
                Salary     = 12000,
                AddressRes = "Rosenkrantzgade"
            };

            db.Add(tjener2);

            var tjener3 = new Waiter()
            {
                Salary     = 20000,
                AddressRes = "Fiskehusvej"
            };

            db.Add(tjener3);

            //************INSERT GUESTS
            var guest = db.Guest;

            // Lillegade *******************************
            var gaest1 = new Guest()
            {
                NameBooker  = "Carsten",
                TableNumber = 1,
                PartySize   = 2,
                Time        = new DateTime(2019, 11, 10, 18, 00, 00),
                AddressRes  = "Lillegade"
            };

            db.Add(gaest1);

            var gaest2 = new Guest()
            {
                NameBooker  = "Lillian",
                TableNumber = 2,
                PartySize   = 4,
                Time        = new DateTime(2019, 11, 10, 19, 30, 00),
                AddressRes  = "Lillegade"
            };

            db.Add(gaest2);

            // Rosenkrantzgade *************************
            var gaest3 = new Guest()
            {
                NameBooker  = "Suzanne",
                TableNumber = 4,
                PartySize   = 3,
                Time        = new DateTime(2019, 11, 11, 12, 30, 00),
                AddressRes  = "Rosenkrantzgade"
            };

            db.Add(gaest3);

            var gaest4 = new Guest()
            {
                NameBooker  = "Allan",
                TableNumber = 5,
                PartySize   = 4,
                Time        = new DateTime(2019, 11, 14, 14, 15, 00),
                AddressRes  = "Rosenkrantzgade"
            };

            db.Add(gaest4);

            // Fiskehusvej *****************************
            var gaest5 = new Guest()
            {
                NameBooker  = "Niklas",
                TableNumber = 7,
                PartySize   = 1,
                Time        = new DateTime(2019, 12, 24, 12, 00, 00),
                AddressRes  = "Fiskehusvej"
            };

            db.Add(gaest5);


            //************INSERT RESTAURANT REVIEWS**************
            var review = db.Review;

            // Lillegade *******************************
            var review1 = new Review()
            {
                DishId       = null,
                ReviewerName = "Carsten",
                Stars        = 5,
                ReviewText   = "Fin restaurant",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(review1);

            var review2 = new Review()
            {
                DishId       = null,
                ReviewerName = "Frederik",
                Stars        = 3,
                ReviewText   = "Kunne vaere bedre",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(review2);

            var review3 = new Review()
            {
                DishId       = null,
                ReviewerName = "Peter",
                Stars        = 1,
                ReviewText   = "Daarlig service",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(review3);

            var review4 = new Review()
            {
                DishId       = null,
                ReviewerName = "Suzanne",
                Stars        = 4,
                ReviewText   = "God mad",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(review4);

            var review5 = new Review()
            {
                DishId       = null,
                ReviewerName = "Jens",
                Stars        = 4,
                ReviewText   = "Fint",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(review5);

            // Rosenkrantzgade *************************
            var review6 = new Review()
            {
                DishId       = null,
                ReviewerName = "Bo",
                Stars        = 3,
                ReviewText   = "Fint",
                Time         = DateTime.Now,
                AddressRes   = "Rosenkrantzgade"
            };

            db.Add(review6);

            // Fiskehusvej *****************************
            var review7 = new Review()
            {
                DishId       = null,
                ReviewerName = "Franz",
                Stars        = 5,
                ReviewText   = "God fisk",
                Time         = DateTime.Now,
                AddressRes   = "Fiskehusvej"
            };

            db.Add(review7);



            //************INSERT DISH REVIEWS**************
            // Lillegade dish 1 ***************************
            var dishReview1 = new Review()
            {
                DishId       = 1,
                ReviewerName = "Carsten",
                Stars        = 5,
                ReviewText   = "Super god bof!",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(dishReview1);

            var dishReview2 = new Review()
            {
                DishId       = 1,
                ReviewerName = "Lillian",
                Stars        = 3,
                ReviewText   = "Kunne vaere bedre",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(dishReview2);

            var dishReview3 = new Review()
            {
                DishId       = 1,
                ReviewerName = "Lars",
                Stars        = 3,
                ReviewText   = "OK",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(dishReview3);

            // Lillegade dish 2 ***************************
            var dishReview4 = new Review()
            {
                DishId       = 2,
                ReviewerName = "Mette",
                Stars        = 5,
                ReviewText   = "Yummy!",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(dishReview4);

            var dishReview5 = new Review()
            {
                DishId       = 2,
                ReviewerName = "Abraham",
                Stars        = 3,
                ReviewText   = "Fin bof",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(dishReview5);

            // Lillegade dish 3 ***************************
            var dishReview13 = new Review()
            {
                DishId       = 3,
                ReviewerName = "Sandra",
                Stars        = 3,
                ReviewText   = "Meget lille bof",
                Time         = DateTime.Now,
                AddressRes   = "Lillegade"
            };

            db.Add(dishReview13);

            // Rosenkrantzgade dish 1 *********************
            var dishReview6 = new Review()
            {
                DishId       = 4,
                ReviewerName = "Karl",
                Stars        = 5,
                ReviewText   = "Altid godt",
                Time         = DateTime.Now,
                AddressRes   = "Rosenkrantzgade"
            };

            db.Add(dishReview6);

            // Rosenkrantzgade dish 2 *********************
            var dishReview7 = new Review()
            {
                DishId       = 5,
                ReviewerName = "Karl",
                Stars        = 5,
                ReviewText   = "Altid godt",
                Time         = DateTime.Now,
                AddressRes   = "Rosenkrantzgade"
            };

            db.Add(dishReview7);

            var dishReview8 = new Review()
            {
                DishId       = 5,
                ReviewerName = "Preben",
                Stars        = 4,
                ReviewText   = "Godt",
                Time         = DateTime.Now,
                AddressRes   = "Rosenkrantzgade"
            };

            db.Add(dishReview8);

            // Rosenkrantzgade dish 3 *********************
            var dishReview9 = new Review()
            {
                DishId       = 6,
                ReviewerName = "Tuomas",
                Stars        = 5,
                ReviewText   = "Yas",
                Time         = DateTime.Now,
                AddressRes   = "Rosenkrantzgade"
            };

            db.Add(dishReview9);

            // Fiskehusvej dish 1 *************************
            var dishReview10 = new Review()
            {
                DishId       = 7,
                ReviewerName = "Brendan",
                Stars        = 5,
                ReviewText   = "Altid godt",
                Time         = DateTime.Now,
                AddressRes   = "Fiskehusvej"
            };

            db.Add(dishReview10);

            var dishReview11 = new Review()
            {
                DishId       = 7,
                ReviewerName = "Sara",
                Stars        = 3,
                ReviewText   = "OK fisk",
                Time         = DateTime.Now,
                AddressRes   = "Fiskehusvej"
            };

            db.Add(dishReview11);

            // Fiskehusvej dish 2 *************************
            var dishReview12 = new Review()
            {
                DishId       = 8,
                ReviewerName = "Finn",
                Stars        = 4,
                ReviewText   = "Mhmm",
                Time         = DateTime.Now,
                AddressRes   = "Fiskehusvej"
            };

            db.Add(dishReview12);


            db.SaveChanges();
        }
Пример #3
0
 public Client(string n, Waiter unServeur)
     : base(n)
 {
     this.leServeur = unServeur;
 }
Пример #4
0
        private static void Main(string[] args)
        {
            IList <IStartable> startables = new List <IStartable>();

            var bus              = new Bus();
            var cashier          = new ThreadedHandler <TakePayment>("Cashier", new Cashier(bus));
            var assistantManager = new ThreadedHandler <PriceOrder>("Assistant Manager",
                                                                    new AssistantManager(new MenuService(), bus));
            var cook1 = new ThreadedHandler <CookFood>("Cook (Chewie)",
                                                       new TtlHandler <CookFood>(new Cook("Chewie", 123, bus)));
            var cook2 = new ThreadedHandler <CookFood>("Cook (Luke)",
                                                       new TtlHandler <CookFood>(new Cook("Luke", 456, bus)));
            var cook3 = new ThreadedHandler <CookFood>("Cook (Darth)",
                                                       new TtlHandler <CookFood>(new Cook("Darth", 217, bus)));
            var mfdDispatcher = new MfdDispatcher <CookFood>(new[] { cook1, cook2, cook3 });
            var kitchen       = new ThreadedHandler <CookFood>("Kitchen", mfdDispatcher);
            var waiter        = new Waiter(new MenuService(), bus);

            bus.Subscribe(cashier);
            bus.Subscribe(assistantManager);
            bus.Subscribe(kitchen);

            var house = new ProcessManagerHouse(bus);

            bus.Subscribe <OrderPlaced>(house);
            bus.Subscribe <OrderPaid>(house);

            var alarmClock = new AlarmClock(bus);

            bus.Subscribe(alarmClock);

            startables.Add(cashier);
            startables.Add(assistantManager);
            startables.Add(cook1);
            startables.Add(cook2);
            startables.Add(cook3);
            startables.Add(kitchen);


            startables.Add(alarmClock);

            foreach (var startable in startables)
            {
                startable.StartListening();
            }

            Task.Factory.StartNew(() =>
            {
                while (!_stop)
                {
                    foreach (var startable in startables)
                    {
                        Console.WriteLine($"Queue: {startable.Name} Count: {startable.Count}");
                    }

                    Thread.Sleep(1000);
                }
            },
                                  TaskCreationOptions.LongRunning);

            for (var i = 0; i < 100; i++)
            {
                var isDodgy = false; //i%2 == 0;
                waiter.PlaceOrder(i, isDodgy, "Sausages", "Beans");
            }

            Console.ReadKey();
        }
Пример #5
0
 public void OrderFood(Waiter unServeur)
 {
     Console.WriteLine("Grec complet salade tomates oignons, sans pain, sans salade, sans tomates, sans sauce et sans oignons, OK ça marche");
     unServeur.PickUp();
 }
Пример #6
0
        private static void Main()
        {
            var publisher = new TopicBasedPubSub();

            var alarmClock         = new AlarmClock(publisher);
            var midgetHouse        = new MidgetHouse(publisher);
            var midgetHouseHandler = new QueuedHandler <Message>("MidgetHouse", midgetHouse);

            midgetHouse.QueuedHandler = midgetHouseHandler;

            var cashier          = new Cashier(publisher);
            var cashierQueue     = new QueuedHandler <TakePayment>("Cashier", cashier);
            var assistantManager = new QueuedHandler <PriceOrdered>("AssistantManager", new FuzzyHandler <PriceOrdered>(new AssistantManager(publisher), 0, 20));

            var seed = new Random(DateTime.Now.Millisecond);

            var cook1 = new QueuedHandler <CookFood>(
                "BogdanQueue",
                new TTLHandler <CookFood>(new FuzzyHandler <CookFood>(new Cook(seed.Next(1000), publisher), 10, 10)));
            var cook2 = new QueuedHandler <CookFood>(
                "RomanQueue",
                new TTLHandler <CookFood>(new FuzzyHandler <CookFood>(new Cook(seed.Next(1000), publisher), 95, 50)));
            var cook3 = new QueuedHandler <CookFood>(
                "WaclawQueue",
                new TTLHandler <CookFood>(new FuzzyHandler <CookFood>(new Cook(seed.Next(1000), publisher), 10, 20)));

            var dispatcher = new QueuedHandler <CookFood>(
                "MFDispatcher",
                new TTLHandler <CookFood>(
                    new MFDispatcher <CookFood>(
                        new List <QueuedHandler <CookFood> >
            {
                cook1,
                cook2,
                cook3
            })));

            StartQueues(
                new List <IStartable>
            {
                assistantManager,
                cashierQueue,
                dispatcher,
                cook1,
                cook2,
                cook3,
                midgetHouseHandler,
                alarmClock
            });
            StartQueuePrinter(
                new List <IPrintable>
            {
                assistantManager,
                cashierQueue,
                dispatcher,
                cook1,
                cook2,
                cook3,
                midgetHouseHandler
            });

            var waiter = new Waiter(publisher);

            publisher.Subscribe(dispatcher);
            publisher.Subscribe(assistantManager);
            publisher.Subscribe(cashier);
            publisher.Subscribe(alarmClock);
            publisher.Subscribe <OrderPlaced>(midgetHouse);

            PlaceOrders(waiter);

            HandlePays(cashier);

            Console.ReadKey();
        }
Пример #7
0
 public void CookOrder(Waiter waiter)
 {
     //waiter.
 }
Пример #8
0
        static void Main(string[] args)
        {
            var es = new AtomDispatcher();

            es.Start("az");
            // es.PostMessage(new OrderPlaced(order), "az");

            QueuedHandler          printOrderHandler = new QueuedHandler(new PrintOrderHandler());
            IEventHandler <IEvent> cashier           = new Cashier();
            QueuedHandler          cashierProxy      = new QueuedHandler(cashier);
            var assistingManager = new QueuedHandler(new AssistingManager("Diana"));
            var cook1            = new QueuedHandler(new TimeToLiveHandler(new Cook("John")));
            var cook2            = new QueuedHandler(new TimeToLiveHandler(new Cook("Peter")));
            var cook3            = new QueuedHandler(new TimeToLiveHandler(new Cook("Gregory")));

            var betterHandler = new QueuedHandler(new Dropper(new TimeToLiveHandler(new BetterDispatcher(new[] { cook1, cook2, cook3 }))));

            TelephoneOperator telephoneOperator = new TelephoneOperator("PhoneMan");
            Waiter            waiter            = new Waiter("Georgie");
            var house      = new MidgetHouse(Dispatcher.Instance);
            var houseQueue = new QueuedHandler(house);

            var clock = new AlarmClock();

            Dispatcher.Instance.Subscribe(typeof(OrderPlaced), houseQueue);
            Dispatcher.Instance.Subscribe(typeof(FoodCooked), houseQueue);
            Dispatcher.Instance.Subscribe(typeof(OrderPriced), houseQueue);
            Dispatcher.Instance.Subscribe(typeof(PaymentTaken), houseQueue);
            Dispatcher.Instance.Subscribe(typeof(FirstCookRetry), houseQueue);
            Dispatcher.Instance.Subscribe(typeof(SecondCookRetry), houseQueue);

            Dispatcher.Instance.Subscribe(typeof(CookFood), betterHandler);
            Dispatcher.Instance.Subscribe(typeof(PriceOrder), assistingManager);
            Dispatcher.Instance.Subscribe(typeof(TakePayment), cashierProxy);
            Dispatcher.Instance.Subscribe(typeof(PrintOrder), printOrderHandler);

            Dispatcher.Instance.Subscribe(typeof(SendToMeIn), clock);

            IEnumerable <QueuedHandler> allHandlers = new List <QueuedHandler> {
                houseQueue, betterHandler, cashierProxy, assistingManager, cook1, cook2, cook3, printOrderHandler
            };
            Monitor monitor = new Monitor(allHandlers, new [] { house });

            monitor.Start();

            foreach (IStartable handler in allHandlers)
            {
                handler.Start();
            }
            clock.Start();
            //waiter.PlaceOrder(new List<int> { 1, 2 });
            //telephoneOperator.PlaceOrder(new List<int> { 1, 2 });

            return;

            for (int i = 0; i < 1000; i++)
            {
                waiter.PlaceOrder(new List <int> {
                    1, 2
                });
                if (i % 3 == 0)
                {
                    Thread.Sleep(50);
                    telephoneOperator.PlaceOrder(new List <int> {
                        1, 2
                    });
                }
                Thread.Sleep(50);
            }
            while (true)
            {
                foreach (string orderId in ((Cashier)cashier).GetOutstandingOrders())
                {
                    Console.WriteLine("Got outstanding order to pay, id " + orderId);
                    ((Cashier)cashier).Pay(orderId, "123456");
                }
                Thread.Sleep(1);
            }
            //Console.ReadLine();
        }
Пример #9
0
        private static void Main(string[] args)
        {
            var dispatcher = new Dispatcher();

            var waiter    = new Waiter(dispatcher);
            var assistant = new AssistantManager(dispatcher);
            var cashier   = new Cashier(dispatcher);

            var timer       = new TimerHandler(dispatcher);
            var house       = new RunnerHouse(dispatcher);
            var serialHouse =
                new ThreadedHandler <Event>(
                    "House",
                    house);

            // set up the kitchen
            var cookedOrders = new ConcurrentDictionary <Guid, bool>();
            var cooks        = new List <Cook> {
                new Cook("James", 100, cookedOrders, dispatcher),
                new Cook("Emily", 50, cookedOrders, dispatcher),
                new Cook("Sarah", 500, cookedOrders, dispatcher)
            };

            var threadedCooks = cooks.Select(c =>
                                             new ThreadedHandler <CookFood>(c.Name, c)).ToList();

            var kitchen =
                new ThreadedHandler <CookFood>(
                    "Kitchen",
                    new ScrewUp <CookFood>(
                        new MorefairDispatcher <CookFood>(
                            threadedCooks)));

            var numCompleted            = 0;
            var numFailedImmediately    = 0;
            var numFailedAfterRetry     = 0;
            var numSucceededImmediately = 0;
            var numSucceededAfterRetry  = 0;

            var onCompleted =
                new ThreadedHandler <OrderCompleted>(
                    "OnCompleted",
                    new Handler <OrderCompleted>(e => {
                numCompleted++;
                if (e.Success && e.Retried)
                {
                    numSucceededAfterRetry++;
                }
                if (e.Success && !e.Retried)
                {
                    numSucceededImmediately++;
                }
                if (!e.Success && e.Retried)
                {
                    numFailedAfterRetry++;
                }
                if (!e.Success && !e.Retried)
                {
                    numFailedImmediately++;
                }
            }));

            // subscribe everything
            dispatcher.Subscribe(kitchen);
            dispatcher.Subscribe(assistant);
            dispatcher.Subscribe(cashier);
            dispatcher.Subscribe(serialHouse);
            dispatcher.Subscribe(timer);
            dispatcher.Subscribe(onCompleted);

            // subscribe various printers
            //dispatcher.Subscribe(new Handler<CookFood>(e => Console.WriteLine($"{e.CorrelationId} Command: CookFood")));
            //dispatcher.Subscribe(new Handler<PriceOrder>(e => Console.WriteLine($"{e.CorrelationId} Command: PriceOrder")));
            //dispatcher.Subscribe(new Handler<TakePayment>(e => Console.WriteLine($"{e.CorrelationId} Command: TakePayment")));
            //dispatcher.Subscribe(new Handler<PrintOrder>(e => Console.WriteLine($"{e.CorrelationId} Command: PrintOrder")));
            //dispatcher.Subscribe(new Handler<Callback>(e => Console.WriteLine($"{e.CorrelationId} Command: Callback")));
            //dispatcher.Subscribe(new Handler<OrderPlaced>(e => Console.WriteLine($"{e.CorrelationId} Ordered")));
            //dispatcher.Subscribe(new Handler<FoodCooked>(e => Console.WriteLine($"{e.CorrelationId} Cooked")));
            //dispatcher.Subscribe(new Handler<OrderPriced>(e => Console.WriteLine($"{e.CorrelationId} Priced")));
            //dispatcher.Subscribe(new Handler<OrderPaid>(e => Console.WriteLine($"{e.CorrelationId} Paid")));
            //dispatcher.Subscribe(new Handler<OrderCompleted>(e => Console.WriteLine($"{e.CorrelationId} OrderCompleted")));
            //dispatcher.Subscribe(new Handler<CookFoodCalledBack>(e => Console.WriteLine($"{e.CorrelationId} CookFoodCalledBack")));
            //dispatcher.Subscribe(new Handler<FailedToContactTheKitchen>(e => Console.WriteLine($"{e.CorrelationId} Failed")));

            // start everything
            serialHouse.Start();
            kitchen.Start();
            foreach (var cook in threadedCooks)
            {
                cook.Start();
            }
            onCompleted.Start();

            var numOrders = 300;

            for (var i = 0; i < numOrders; i++)
            {
                waiter.PlaceOrder("Toby", 1, new List <Tuple <string, int> > {
                    Tuple.Create("Meat", 2),
                    Tuple.Create("Veg", 1)
                });
            }

            Action print = () => {
                Console.WriteLine($"-----------------------------------------");
                Console.WriteLine($"{kitchen.Name}: {kitchen.Count}");
                foreach (var cook in threadedCooks)
                {
                    Console.WriteLine($"{cook.Name}: {cook.Count}");
                }
                Console.WriteLine($"{onCompleted.Name}: {onCompleted.Count}");

                Console.WriteLine($"Timer {timer.Count}");
                Console.WriteLine($"Runners {house.CountRunners}");
                Console.WriteLine($"num Failed Immediately {numFailedImmediately}");
                Console.WriteLine($"num Failed AfterRetry {numFailedAfterRetry}");
                Console.WriteLine($"num Succeeded Immediately {numSucceededImmediately}");
                Console.WriteLine($"num Succeeded AfterRetry {numSucceededAfterRetry}");
                Console.WriteLine($"Complete {numCompleted}/{numOrders}");

                Thread.Sleep(1000);
            };

            while (numCompleted < numOrders)
            {
                print();
            }
            print();
            Console.WriteLine("All done");
        }