public void TestEverything()
        {
            var innerDispatcher = new MessageDispatcher();
            var dispatcher      = new LoggingMessageDispatcher(innerDispatcher);
            var orderRepo       = new OrderRepository();

            var entryPoint = new AppEntryPoint(dispatcher);
            var order      = new Order {
                TicketCount = 4, Subtotal = 100M
            };
            var orderProcessor = new OrderProcessor(dispatcher);
            var ticketManager  = new TicketManager(dispatcher, orderRepo, 500);
            var feeManager     = new BasicFeeManager(dispatcher);
            var taxManager     = new TaxManager(dispatcher);
            var paymentManager = new PaymentManager(dispatcher);
            var storageManager = new StorageManager(dispatcher, orderRepo);

            dispatcher.Subscribe <OrderPlaced>(orderProcessor);
            dispatcher.Subscribe <TicketsReserved>(orderProcessor);
            dispatcher.Subscribe <FeesCalculated>(orderProcessor);
            dispatcher.Subscribe <TaxesCalculated>(orderProcessor);
            dispatcher.Subscribe <CreditCardCharged>(orderProcessor);
            dispatcher.Subscribe(ticketManager);
            dispatcher.Subscribe(feeManager);
            dispatcher.Subscribe(taxManager);
            dispatcher.Subscribe(paymentManager);
            dispatcher.Subscribe(storageManager);

            entryPoint.TakeOrder(4, 50M, "1234-1234-1234-1223");
        }
        static void Main(string[] args)
        {
            var orderRepo       = new OrderRepository();
            var innerDispatcher = new MessageDispatcher();
            var dispatcher      = new LoggingMessageDispatcher(innerDispatcher);

            var entryPoint     = new AppEntryPoint(dispatcher);
            var orderProcessor = new OrderProcessor(dispatcher);
            var ticketManager  = new TicketManager(dispatcher, orderRepo, 500);
            var feeManager     = new BasicFeeManager(dispatcher);
            var taxManager     = new TaxManager(dispatcher);
            var paymentManager = new PaymentManager(dispatcher);
            var storageManager = new StorageManager(dispatcher, orderRepo);

            dispatcher.Subscribe <OrderPlaced>(orderProcessor);
            dispatcher.Subscribe <TicketsReserved>(orderProcessor);
            dispatcher.Subscribe <FeesCalculated>(orderProcessor);
            dispatcher.Subscribe <TaxesCalculated>(orderProcessor);
            dispatcher.Subscribe <CreditCardCharged>(orderProcessor);

            dispatcher.Subscribe(ticketManager);
            dispatcher.Subscribe(feeManager);
            dispatcher.Subscribe(taxManager);
            dispatcher.Subscribe(paymentManager);
            dispatcher.Subscribe(storageManager);
            dispatcher.Subscribe(entryPoint);

            entryPoint.TakeOrder(4, 50M, "1234-1234-1234-1223");

            System.Console.ReadKey();
        }