private static void Main(string[] args)
        {
            var configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddEnvironmentVariables("ESHOP_");

            Configuration = configurationBuilder.Build();

            Console.Title = "Elastic";
            var config = new LoggerConfiguration()
                         .MinimumLevel.Debug()
                         .Enrich.FromLogContext().Enrich.WithThreadId().Enrich.WithProcessName().Enrich.WithProperty("Endpoint", "Elastic")
                         .WriteTo.Console(outputTemplate: "[{Level}] {Message}{NewLine}{Exception}",
                                          restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Warning);

            if (!string.IsNullOrEmpty(Configuration["SeqConnection"]))
            {
                config.WriteTo.Seq(Configuration["SeqConnection"]);
            }

            Log.Logger = config.CreateLogger();

            AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;

            NServiceBus.Logging.LogManager.Use <SerilogFactory>();

            var client = GetElastic();

            // Scan working directory for assemblies containing messages
            var assemblies = new Assembly[] { Assembly.GetExecutingAssembly() }.Concat(
                DIExtensions.GetAssembliesInDirectory(selector: (file) => file.Name.StartsWith("Aggregates") || file.Name.StartsWith("eShop"))).ToList();

            _container = new Container(x =>
            {
                x.For <IValidatorFactory>().Use <StructureMapValidatorFactory>();
                x.For <IMessageSession>().Use(() => Aggregates.Bus.Instance);
                x.For <IElasticClient>().Use(client);
                x.For <Infrastructure.IUnitOfWork>().Use <UnitOfWork>();
                x.For <Aggregates.UnitOfWork.IApplication>().Add(b => (Aggregates.UnitOfWork.IApplication)b.GetInstance <Infrastructure.IUnitOfWork>());

                x.Scan(y =>
                {
                    // Note do not use structuremap's assembly scanning it will load EVERY package in nuget
                    foreach (var a in assemblies)
                    {
                        y.Assembly(a);
                    }

                    y.WithDefaultConventions();
                    y.AddAllTypesOf <ISetup>();
                });
            });
            // Setup any app stuff that might exist
            AppSetup.InitiateSetup(_container.GetAllInstances <ISetup>());
            AppSetup.SetupApplication().Wait();

            // Start the bus
            _bus = InitBus().Result;

            Console.WriteLine("Press CTRL+C to exit...");
            Console.CancelKeyPress += (sender, eArgs) =>
            {
                QuitEvent.Set();
                eArgs.Cancel = true;
            };
            QuitEvent.WaitOne();

            _bus.Stop().Wait();
        }