예제 #1
0
        private static IContainer BuildContainer(IConfiguration configuration)
        {
            var services = new ServiceCollection();
            services.AddLogging(logging =>
            {
                logging.SetMinimumLevel(LogLevel.Information);
                logging.AddConsole();
            });
            var containerBuilder = new ContainerBuilder();
            containerBuilder.Populate(services);
            containerBuilder.RegisterType<Account>()
                .AsSelf()
                .InstancePerDependency();
            containerBuilder.RegisterType<AccountBalanceMinion>()
                .AsSelf()
                .InstancePerDependency();
            var builder = new AutofacClaptrapBootstrapperBuilder(new NullLoggerFactory(), containerBuilder);
            var claptrapBootstrapper = builder
                .ScanClaptrapModule()
                .AddConfiguration(configuration)
                .ScanClaptrapDesigns(new[]
                {
                    typeof(IAccount),
                    typeof(Account),
                    typeof(IAccountBalanceMinion),
                    typeof(AccountBalanceMinion),
                })
                .Build();
            claptrapBootstrapper.Boot();

            var container = containerBuilder.Build();
            return container;
        }
예제 #2
0
        public static IHostBuilder UseClaptrap(this IHostBuilder hostBuilder,
                                               Action <IClaptrapBootstrapperBuilder> builderAction,
                                               Action <ContainerBuilder>?containerBuilderAction = null)
        {
            return(hostBuilder
                   .ConfigureServices((context, collection) =>
            {
                var configSection =
                    context.Configuration.GetSection(ClaptrapServerOptions.ConfigurationSectionName);
                collection.Configure <ClaptrapServerOptions>(configSection);
            })
                   .UseServiceProviderFactory(context =>
            {
                var serviceProviderFactory = new AutofacServiceProviderFactory(
                    builder =>
                {
                    var collection = new ServiceCollection().AddLogging(logging =>
                    {
                        logging.SetMinimumLevel(LogLevel.Debug);
                    });
                    var buildServiceProvider = collection.BuildServiceProvider();
                    var loggerFactory = buildServiceProvider.GetService <ILoggerFactory>();
                    var bootstrapperBuilder = new AutofacClaptrapBootstrapperBuilder(loggerFactory, builder);
                    bootstrapperBuilder
                    .ScanClaptrapModule()
                    .AddConfiguration(context);
                    builderAction.Invoke(bootstrapperBuilder);
                    var claptrapBootstrapper = bootstrapperBuilder.Build();
                    claptrapBootstrapper.Boot();
                    containerBuilderAction?.Invoke(builder);
                });

                return serviceProviderFactory;
            }));
        }
예제 #3
0
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            var loggerFactory = new ServiceCollection()
                                .AddLogging(logging => logging.AddConsole())
                                .BuildServiceProvider()
                                .GetRequiredService <ILoggerFactory>();

            var bootstrapperBuilder = new AutofacClaptrapBootstrapperBuilder(loggerFactory);

            _claptrapBootstrapper = (AutofacClaptrapBootstrapper)bootstrapperBuilder
                                    .ScanClaptrapModule()
                                    .AddConfiguration(configuration)
                                    .ScanClaptrapDesigns(new[]
            {
                typeof(IAccount),
                typeof(Account),
                typeof(IAccountBalanceMinion),
                typeof(AccountBalanceMinion),
                typeof(IAccountHistoryBalanceMinion),
                typeof(AccountHistoryBalanceMinion)
            })
                                    .ConfigureClaptrapDesign(x =>
                                                             x.ClaptrapOptions.EventCenterOptions.EventCenterType = EventCenterType.None)
                                    .Build();
            _claptrapDesignStore = _claptrapBootstrapper.DumpDesignStore();
        }
예제 #4
0
        /// <summary>
        /// Get attribute based claptrap design. It is used in unit test in common.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static IClaptrapDesign GetDesign(Type type)
        {
            var claptrapBootstrapperBuilder = new AutofacClaptrapBootstrapperBuilder()
                                              .ScanClaptrapDesigns(new[] { type })
                                              .SetDesignValidation(false)
                                              .Build();
            var claptrapDesignStore = claptrapBootstrapperBuilder.DumpDesignStore();
            var claptrapDesign      = claptrapDesignStore.First();

            return(claptrapDesign);
        }
예제 #5
0
        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup <Startup>(); })
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.SetMinimumLevel(LogLevel.Trace);
        })
        .UseNLog()
        .UseOrleansClaptrap()
        .ConfigureAppConfiguration(builder =>
        {
            var configBuilder = new ConfigurationBuilder();
            configBuilder.AddJsonFile("appsettings.json");
            var config  = configBuilder.Build();
            var options = new BurningDatabaseOptions();
            config.GetSection("BurningDatabase").Bind(options);
            builder.AddJsonFile($"Claptrap/claptrap.{options.DatabaseType:G}.json");
        })
        .ConfigureServices((context, collection) =>
        {
            collection.Configure <BurningDatabaseOptions>(options =>
            {
                context.Configuration.GetSection("BurningDatabase").Bind(options);
            });
        })
        .UseServiceProviderFactory(context =>
        {
            var serviceProviderFactory = new AutofacServiceProviderFactory(
                builder =>
            {
                builder.RegisterModule <BurningModule>();

                var collection = new ServiceCollection()
                                 .AddLogging(logging => { logging.SetMinimumLevel(LogLevel.Debug); });
                var buildServiceProvider = collection.BuildServiceProvider();
                var loggerFactory        = buildServiceProvider.GetService <ILoggerFactory>();
                var bootstrapperBuilder  = new AutofacClaptrapBootstrapperBuilder(loggerFactory, builder);
                var claptrapBootstrapper = bootstrapperBuilder
                                           .ScanClaptrapModule()
                                           .AddConfiguration(context)
                                           .ScanClaptrapDesigns(new[]
                {
                    typeof(Burning).Assembly
                })
                                           .Build();
                claptrapBootstrapper.Boot();
            });


            return(serviceProviderFactory);
        });
        public void NothingAdded()
        {
            var serviceCollection    = new ServiceCollection().AddLogging(logging => logging.AddConsole());
            var buildServiceProvider = serviceCollection.BuildServiceProvider();
            var loggerFactory        = buildServiceProvider.GetRequiredService <ILoggerFactory>();

            using var mocker = AutoMockHelper.Create();
            var containerBuilder     = new ContainerBuilder();
            var builder              = new AutofacClaptrapBootstrapperBuilder(loggerFactory, containerBuilder);
            var claptrapBootstrapper = builder.Build();

            claptrapBootstrapper.Should().NotBeNull();
        }
예제 #7
0
        static async Task Main(string[] args)
        {
            var hostBuilder = new SiloHostBuilder();

            hostBuilder
            .UseLocalhostClustering()
            .UseServiceProviderFactory(collection =>
            {
                collection.AddLogging(logging =>
                {
                    logging.AddConsole();
                    logging.SetMinimumLevel(LogLevel.Debug);
                    logging.AddFilter((s, level) => s.StartsWith("Orleans") && level >= LogLevel.Warning);
                    logging.AddFilter((s, level) => s.Contains("Claptrap"));
                });
                var builder = new ContainerBuilder();

                builder.Populate(collection);

                var buildServiceProvider = collection.BuildServiceProvider();
                var loggerFactory        = buildServiceProvider.GetService <ILoggerFactory>();
                var bootstrapperBuilder  = new AutofacClaptrapBootstrapperBuilder(loggerFactory, builder);
                var claptrapBootstrapper = bootstrapperBuilder
                                           .ScanClaptrapModule()
                                           .UseSQLiteAsTestingStorage()
                                           .ScanClaptrapDesigns(new[]
                {
                    typeof(ArticleGrain).Assembly
                })
                                           .Build();
                claptrapBootstrapper.Boot();


                var container       = builder.Build();
                var serviceProvider = new AutofacServiceProvider(container);
                return(serviceProvider);
            })
            .ConfigureApplicationParts(manager =>
                                       manager.AddFromDependencyContext().WithReferences())
            ;
            var siloHost = hostBuilder.Build();

            Console.WriteLine("server starting");
            await siloHost.StartAsync();

            Console.WriteLine("server started");

            Console.ReadLine();
        }
예제 #8
0
        private static IClaptrapBootstrapper CreateClaptrapBootstrapper(ILoggerFactory loggerFactory,
                                                                        ContainerBuilder builder)
        {
            var claptrapBootstrapperBuilder =
                new AutofacClaptrapBootstrapperBuilder(loggerFactory, builder);
            var bootstrapper = claptrapBootstrapperBuilder
                               .ScanClaptrapModule()
                               .ScanClaptrapDesigns(new[]
            {
                typeof(IAccountClaptrap).Assembly
            })
                               .UseSQLiteAsTestingStorage()
                               .Build();

            return(bootstrapper);
        }
예제 #9
0
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            var loggerFactory = new ServiceCollection()
                                .AddLogging(logging => logging.AddConsole())
                                .BuildServiceProvider()
                                .GetRequiredService <ILoggerFactory>();

            var bootstrapperBuilder = new AutofacClaptrapBootstrapperBuilder(loggerFactory);

            _claptrapBootstrapper = (AutofacClaptrapBootstrapper)bootstrapperBuilder
                                    .ScanClaptrapModule()
                                    .AddConfiguration(configuration)
                                    .ScanClaptrapDesigns(new[] { typeof(SeatActor).Assembly })
                                    .Build();
            _claptrapDesignStore = _claptrapBootstrapper.DumpDesignStore();
        }
예제 #10
0
        private static IContainer CreateContainer()
        {
            var serviceCollection = new ServiceCollection();

            serviceCollection.AddLogging(logging => logging.AddConsole());
            var builder = new ContainerBuilder();

            builder.Populate(serviceCollection);
            var autofacClaptrapBootstrapperBuilder =
                new AutofacClaptrapBootstrapperBuilder(new NullLoggerFactory(), builder);
            var claptrapBootstrapper = autofacClaptrapBootstrapperBuilder
                                       .ScanClaptrapDesigns(new[] { typeof(SagaClaptrap).Assembly })
                                       .ScanClaptrapModule()
                                       .ConfigureClaptrapDesign(x =>
                                                                x.ClaptrapOptions.EventCenterOptions.EventCenterType = EventCenterType.None)
                                       .UseSQLiteAsTestingStorage()
                                       .Build();

            claptrapBootstrapper.Boot();
            builder.RegisterType <SagaClaptrap>()
            .AsSelf()
            .InstancePerLifetimeScope();
            builder.RegisterType <TestStep1>()
            .AsSelf()
            .InstancePerLifetimeScope();
            builder.RegisterType <TestStep2>()
            .AsSelf()
            .InstancePerLifetimeScope();
            builder.RegisterType <CompensateStep1>()
            .AsSelf()
            .InstancePerLifetimeScope();
            builder.RegisterType <CompensateStep2>()
            .AsSelf()
            .InstancePerLifetimeScope();
            builder.RegisterType <ExceptionStep>()
            .AsSelf()
            .InstancePerLifetimeScope();
            var container = builder.Build();

            return(container);
        }
        public void NothingAdded()
        {
            var serviceCollection = new ServiceCollection()
                                    .AddLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(LogLevel.Trace);
                logging.AddNLog();
            });
            var buildServiceProvider = serviceCollection.BuildServiceProvider();
            var loggerFactory        = buildServiceProvider.GetRequiredService <ILoggerFactory>();

            using var mocker = AutoMockHelper.Create();
            var containerBuilder = new ContainerBuilder();

            containerBuilder.Populate(serviceCollection);
            var builder = new AutofacClaptrapBootstrapperBuilder(loggerFactory, containerBuilder);
            var claptrapBootstrapper = builder.Build();

            claptrapBootstrapper.Should().NotBeNull();
        }
예제 #12
0
        public static IHost BuildHost(
            DatabaseType databaseType,
            RelationLocatorStrategy strategy,
            IEnumerable <string> configJsonFilenames,
            Action <ContainerBuilder> builderAction = null,
            Action <IClaptrapBootstrapperBuilder> bootstrapperAction = null,
            Action <HostBuilder> configureHostBuilder = null)
        {
            var hostBuilder = new HostBuilder();

            hostBuilder
            .ConfigureAppConfiguration(configurationBuilder =>
            {
                configurationBuilder
                .AddJsonFile("configs/appsettings.json")
                .AddJsonFile($"configs/db_configs/claptrap.{databaseType:G}.json".ToLower())
                .AddJsonFile($"configs/db_configs/claptrap.{databaseType:G}.{strategy:G}.json".ToLower());
                foreach (var filename in configJsonFilenames)
                {
                    configurationBuilder.AddJsonFile(filename);
                }

                configurationBuilder.AddEnvironmentVariables();
            })
            .ConfigureServices(collection =>
            {
                collection.AddLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(LogLevel.Trace);
                    logging.AddNLog();
                });
            })
            .UseServiceProviderFactory(context =>
            {
                return(new AutofacServiceProviderFactory(builder =>
                {
                    var loggerFactory = new ServiceCollection()
                                        .AddLogging(logging =>
                    {
                        logging.SetMinimumLevel(LogLevel.Trace);
                        logging.AddConsole();
                    })
                                        .BuildServiceProvider()
                                        .GetRequiredService <ILoggerFactory>();
                    var claptrapBootstrapperBuilder = new AutofacClaptrapBootstrapperBuilder(loggerFactory)
                                                      .ScanClaptrapModule()
                                                      .AddConfiguration(context.Configuration)
                                                      .ScanClaptrapDesigns(new[]
                    {
                        typeof(IAccount),
                        typeof(Account),
                        typeof(IAccountBalanceMinion),
                        typeof(AccountBalanceMinion),
                        typeof(IAccountHistoryBalanceMinion),
                        typeof(AccountHistoryBalanceMinion)
                    })
                                                      .ConfigureClaptrapDesign(x =>
                                                                               x.ClaptrapOptions.EventCenterOptions.EventCenterType = EventCenterType.None);
                    bootstrapperAction?.Invoke(claptrapBootstrapperBuilder);
                    var claptrapBootstrapper =
                        (AutofacClaptrapBootstrapper)claptrapBootstrapperBuilder
                        .Build();
                    claptrapBootstrapper.Boot(builder);

                    builder.RegisterType <Account>()
                    .AsSelf()
                    .InstancePerDependency();
                    builder.RegisterType <AccountBalanceMinion>()
                    .AsSelf()
                    .InstancePerDependency();

                    builderAction?.Invoke(builder);
                }));
            })
            .ConfigureServices((_, collection) => { collection.AddClaptrapServerOptions(); });
            configureHostBuilder?.Invoke(hostBuilder);
            var host = hostBuilder.Build();

            return(host);
        }
예제 #13
0
        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .UseOrleansClaptrap()
        .UseOrleans((context, builder) =>
        {
            var config         = context.Configuration.GetSection(ClaptrapServeringOptions.ConfigurationSectionName);
            var claptrapConfig = new ClaptrapClusteringOptions();
            config.Bind(claptrapConfig);
            if (claptrapConfig?.Orleans?.EnableDashboard == true)
            {
                builder.UseDashboard(options => options.Port = 9000);
            }
        })
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.SetMinimumLevel(LogLevel.Trace);
        })
        .UseNLog()
        .UseServiceProviderFactory(context =>
        {
            var serviceProviderFactory = new AutofacServiceProviderFactory(
                builder =>
            {
                builder.RegisterModule <RepositoryModule>();

                var collection = new ServiceCollection().AddLogging(logging =>
                {
                    logging.SetMinimumLevel(LogLevel.Debug);
                });
                var buildServiceProvider = collection.BuildServiceProvider();
                var loggerFactory        = buildServiceProvider.GetService <ILoggerFactory>();
                var bootstrapperBuilder  = new AutofacClaptrapBootstrapperBuilder(loggerFactory, builder);

                var claptrapBootstrapper = bootstrapperBuilder
                                           .ScanClaptrapModule()
                                           .AddDefaultConfiguration(context)
                                           .ScanClaptrapDesigns(new[]
                {
                    typeof(UserGrain).Assembly
                })
                                           .UsePostgreSQL(mysql =>
                                                          mysql
                                                          .AsEventStore(eventStore =>
                                                                        eventStore.SharedTable())
                                                          .AsStateStore(stateStore =>
                                                                        stateStore.SharedTable())
                                                          )
                                           .Build();
                claptrapBootstrapper.Boot();
            });


            return(serviceProviderFactory);
        })
#if !DEBUG
        .UseOrleans((context, siloBuilder) =>
        {
            siloBuilder
            .UseConsulClustering(options =>
            {
                options.Address =
                    new Uri(context.Configuration["Claptrap:Orleans:Clustering:ConsulUrl"]);
            })
            .ConfigureApplicationParts(manager =>
                                       manager.AddFromDependencyContext().WithReferences());
        })
#endif
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup <Startup>(); });
예제 #14
0
        public static async Task Old()
        {
            var services = new ServiceCollection();

            services.AddLogging(logging =>
            {
                // logging.AddConsole();
            });
            var containerBuilder = new ContainerBuilder();

            containerBuilder.Populate(services);
            containerBuilder.RegisterType <Burning>()
            .AsSelf()
            .InstancePerDependency();
            var builder = new AutofacClaptrapBootstrapperBuilder(new NullLoggerFactory(), containerBuilder);
            var claptrapBootstrapper = builder
                                       .ScanClaptrapDesigns(new[]
            {
                typeof(Burning),
                typeof(IBurning),
            })
                                       .ScanClaptrapModule()
                                       .UseSQLiteAsTestingStorage()
                                       .Build();

            claptrapBootstrapper.Boot();

            var       container       = containerBuilder.Build();
            var       factory         = container.Resolve <Burning.Factory>();
            var       sw              = Stopwatch.StartNew();
            const int maxBurningCount = 100;
            var       burnings        = Enumerable.Range(0, maxBurningCount)
                                        .Select(x => factory.Invoke(new ClaptrapIdentity(x.ToString(), Codes.Burning)))
                                        .ToArray();
            await Task.WhenAll(burnings.Select(x => x.ActivateAsync()));

            Console.WriteLine($"cost {sw.ElapsedMilliseconds} ms to activate all");

            var total = Stopwatch.StartNew();
            var rd    = new Random();

            for (var i = 0; i < 1_000_000; i++)
            {
                sw.Restart();
                var tasks = Enumerable.Range(0, 1_000)
                            .Select(x =>
                {
                    var id = rd.Next(0, maxBurningCount);
                    return(burnings[id].HandleOneAsync());
                })
                            .ToArray();
                await Task.WhenAll(tasks);

                Console.WriteLine($"cost {sw.ElapsedMilliseconds} ms, {i}");
            }

            Console.WriteLine($"total cost {total.ElapsedMilliseconds} ms");

            // var container = containerBuilder.Build();
            // var factory = (ClaptrapFactory) container.Resolve<IClaptrapFactory>();
            // var id = new ClaptrapIdentity("1", Codes.Burning);
            // var lifetimeScope = factory.BuildClaptrapLifetimeScope(id);
            // var eventSaver = lifetimeScope.Resolve<IEventSaver>();
            // var sw = Stopwatch.StartNew();
            //
            // var total = Stopwatch.StartNew();
            // for (var i = 0; i < 1_000_000; i++)
            // {
            //     sw.Restart();
            //     const int batchItemCount = 1_000;
            //     var tasks = Enumerable.Range(i * batchItemCount, batchItemCount)
            //         .Select(x =>
            //         {
            //             var unitEvent = new UnitEvent(id, Codes.BurningEvent,
            //                 UnitEvent.UnitEventData.Create())
            //             {
            //                 Version = x,
            //             };
            //             return eventSaver.SaveEventAsync(unitEvent);
            //         });
            //     await Task.WhenAll(tasks);
            //     Thread.Sleep(1);
            //     Console.WriteLine($"cost {sw.ElapsedMilliseconds} ms, {(i + 1) * batchItemCount}");
            // }
            //
            // Console.WriteLine($"total cost {total.ElapsedMilliseconds} ms");
        }