static void Main(string[] args)
        {
            bool exit = false;

            while (!exit)
            {
                Console.WriteLine();
                Console.WriteLine("1 - Stage 1");
                Console.WriteLine("2 - Stage 2");
                Console.WriteLine("3 - Stage 3");
                Console.WriteLine("0 - Exit");
                Console.WriteLine();
                Console.Write("Select demo: ");

                string choice = Console.ReadLine();

                if (choice == "0")
                {
                    exit = true;
                }
                else
                {
                    OrderInfo orderInfo = new OrderInfo()
                    {
                        CustomerName = "John Doe",
                        Email        = "*****@*****.**",
                        Product      = "Laptop",
                        Price        = 1200,
                        CreditCard   = "1234567890"
                    };

                    Console.WriteLine();
                    Console.WriteLine("Order Processing:");
                    Console.WriteLine();

                    switch (choice)
                    {
                    case "1":
                        #region stage 1

                        Stage1.Commerce commerce1 = new Stage1.Commerce();
                        commerce1.ProcessOrder(orderInfo);

                        #endregion

                        break;

                    case "2":
                        #region stage 2

                        Stage2.Commerce commerce2 =
                            new Stage2.Commerce(
                                new Stage2.BillingProcessor(),
                                new Stage2.CustomerProcessor(
                                    new Stage2.CustomerRepository(),
                                    new Stage2.ProductRepository()),
                                new Stage2.Notifier());

                        commerce2.ProcessOrder(orderInfo);

                        #endregion

                        break;

                    case "3":
                        #region stage 3

                        ContainerBuilder builder = new ContainerBuilder();

                        builder.RegisterType <Stage3.Commerce>();
                        builder.RegisterType <Stage3.Notifier>().As <Stage3.INotifier>();

                        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                        .Where(t => t.Name.EndsWith("Processor") && t.Namespace.EndsWith("Stage3"))
                        .As(t => t.GetInterfaces().FirstOrDefault(
                                i => i.Name == "I" + t.Name));

                        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                        .Where(t => t.Name.EndsWith("Repository") && t.Namespace.EndsWith("Stage3"))
                        .As(t => t.GetInterfaces().FirstOrDefault(
                                i => i.Name == "I" + t.Name));

                        builder.RegisterType <Stage3.Logger>().As <Stage3.ILogger>();

                        Container = builder.Build();

                        Stage3.Commerce commerce3 = Container.Resolve <Stage3.Commerce>();

                        commerce3.ProcessOrder(orderInfo);

                        #endregion

                        break;
                    }

                    Console.WriteLine();
                    Console.WriteLine("Press 'Enter' for menu.");
                    Console.ReadLine();
                    Console.Clear();
                }
            }
        }
        static void Main(string[] args)
        {
            bool exit = false;

            while (!exit)
            {
                Console.WriteLine();
                Console.WriteLine("1 - Stage 1");
                Console.WriteLine("2 - Stage 2");
                Console.WriteLine("3 - Stage 3");
                Console.WriteLine("0 - Exit");
                Console.WriteLine();
                Console.Write("Select demo initialization: ");
                string choice = Console.ReadLine();
                if (choice == "0")
                {
                    exit = true;
                }
                else
                {
                    OrderInfo orderInfo = new OrderInfo()
                    {
                        CustomerName = "Miguel Castro",
                        Email        = "*****@*****.**",
                        Product      = "Laptop",
                        Price        = 1200,
                        CreditCard   = "1234567890"
                    };

                    Console.WriteLine();
                    Console.WriteLine("Order Processing:");
                    Console.WriteLine();

                    switch (choice)
                    {
                    case "1":
                        #region stage 1
                        Stage1.Commerce commerce1 = new Stage1.Commerce();
                        commerce1.ProcessOrder(orderInfo);
                        #endregion

                        break;

                    case "2":
                        #region stage 2
                        Stage2.Commerce commerce2 =
                            new Stage2.Commerce(
                                new Stage2.BillingProcessor(),
                                new Stage2.CustomerProcessor(
                                    new Stage2.CustomerRepository(),
                                    new Stage2.ProductRepository()),
                                new Stage2.Notifier());
                        commerce2.ProcessOrder(orderInfo);
                        #endregion

                        break;
                    }

                    Console.WriteLine();
                    Console.WriteLine("Press 'Enter' for menu.");
                    Console.ReadLine();
                    Console.Clear();
                }
            }
        }