//------------------------------------------------------------------------------
        //
        // Method: MethodInvocationRemoteSender (constructor)
        //
        //------------------------------------------------------------------------------
        /// <summary>
        /// Initialises a new instance of the MethodInvocationRemoting.MethodInvocationRemoteSender class.
        /// </summary>
        /// <param name="serializer">Object to use to serialize method invocations.</param>
        /// <param name="sender">Object to use to send serialized method invocations.</param>
        /// <param name="receiver">Object to use to receive serialized method invocation return values.</param>
        public MethodInvocationRemoteSender(IMethodInvocationSerializer serializer, IRemoteSender sender, IRemoteReceiver receiver)
        {
            this.serializer = serializer;
            this.sender     = sender;
            this.receiver   = receiver;
            ConsoleApplicationLogger logger = new ConsoleApplicationLogger(LogLevel.Information, '|', "  ");

            loggingUtilities = new LoggingUtilities(logger);
            metricsUtilities = new MetricsUtilities(new NullMetricLogger());
        }
        private static void Main()
        {
            IBus bus = new FakeBus();
            IApplicationLogger applicationLogger = new ConsoleApplicationLogger();

            const int orderId    = 100;
            const int customerId = 200;
            const int paymentId  = 300;

            // Place order
            PlaceOrderV1 placeOrderV1 = new PlaceOrderV1(orderId, customerId);

            placeOrderV1.OrderDetails.OrderItems.Add(new OrderItem(400, "desc", 9.99m, 2));
            applicationLogger.SendMessage(placeOrderV1);
            bus.Send(placeOrderV1);

            // Choose delivery options
            SubmitDeliveryOptionsV1 submitDeliveryOptionsV1 = new SubmitDeliveryOptionsV1(orderId);

            submitDeliveryOptionsV1.DeliveryOptions.DeliveryMethod   = "method";
            submitDeliveryOptionsV1.DeliveryOptions.Address.Line1    = "Line 1";
            submitDeliveryOptionsV1.DeliveryOptions.Address.Line2    = "Line 2";
            submitDeliveryOptionsV1.DeliveryOptions.Address.City     = "City";
            submitDeliveryOptionsV1.DeliveryOptions.Address.PostCode = "A1 1AB";
            applicationLogger.SendMessage(submitDeliveryOptionsV1);
            bus.Send(submitDeliveryOptionsV1);

            // Submit payment info
            SubmitPaymentDetailsV1 submitPaymentDetailsV1 = new SubmitPaymentDetailsV1(orderId);

            submitPaymentDetailsV1.PaymentDetails.Amount     = 9.99m;
            submitPaymentDetailsV1.PaymentDetails.CardNumber = "1234123412341234";
            submitPaymentDetailsV1.PaymentDetails.Ccv        = "111";
            submitPaymentDetailsV1.PaymentDetails.Expiry     = "01/01";
            submitPaymentDetailsV1.PaymentDetails.PaymentId  = paymentId;
            applicationLogger.SendMessage(submitPaymentDetailsV1);
            bus.Send(submitPaymentDetailsV1);

            // Confirm order
            ConfirmOrderV1 confirmOrderV1 = new ConfirmOrderV1(orderId, customerId);

            applicationLogger.SendMessage(confirmOrderV1);
            bus.Send(confirmOrderV1);

            Console.ReadLine();
        }