public Task <EngineContext> BuildContext(string sqliteDbPath, Action <IServiceCollection> configureServices = null) { var services = new ServiceCollection(); var domainMarker = typeof(Szlem.Domain.Marker); var engineMarker = typeof(Szlem.Engine.Marker); var guid = Guid.NewGuid(); var dbFileName = GenerateSqliteDbName(sqliteDbPath, guid); System.IO.File.Copy(sqliteDbPath, dbFileName); var recruitmentConfig = new Szlem.Recruitment.Config() { DbConnectionString = "DataSource=:memory:", KeepDbSessionOpen = true }; services.AddEFUnitOfWork(options => options .UseSqlite( $"Data Source={dbFileName}", x => x.MigrationsAssembly(typeof(Szlem.Persistence.EF.AppDbContext).Assembly.GetName().Name)) .EnableSensitiveDataLogging(true)); #pragma warning disable CS0618 // for testing purposes only services.AddSzlemApplicationWithoutAuthorization(); #pragma warning restore CS0618 // Type or member is obsolete services.AddSzlemRecruitmentImpl(recruitmentConfig); services.AddScoped <Engine.Interfaces.IUserAccessor, UserAccessor>(); configureServices?.Invoke(services); var serviceProvider = services.BuildServiceProvider(); serviceProvider.GetRequiredService <DbSessionProvider>().UnsafeCleanAndRebuildSchema(); return(Task.FromResult(new EngineContext(guid, dbFileName, serviceProvider))); }
public IServiceProvider BuildServiceProvider(Action <IServiceCollection> registerServices = null) { var config = new Szlem.Recruitment.Config() { DbConnectionString = "DataSource=:memory:", KeepDbSessionOpen = true, GreetingEmail = new Config.EmailMessageConfig() { Body = "Dziękujemy za zgłoszenie do projektu LEM", Subject = "Dziękujemy za zgłoszenie do projektu LEM", IsBodyHtml = false }, TrainingReminderEmail = new Config.EmailMessageConfig() { Body = "Przypominamy o jutrzejszym szkoleniu", Subject = "Przypominamy o jutrzejszym szkoleniu", IsBodyHtml = false } }; var services = new ServiceCollection(); services.AddLogging(); services.AddSingleton <SharedKernel.ISzlemEngine, Engine.SzlemEngine>(); services.AddMediatR(typeof(Szlem.Recruitment.Impl.Marker)); services.AddScoped(typeof(IPipelineBehavior <,>), typeof(Engine.Behaviors.ValidationBehavior <,>)); services.AddSingleton <FluentValidation.IValidatorFactory, ServiceProviderValidatorFactory>(); services.AddSingleton <NodaTime.IClock>(NodaTime.SystemClock.Instance); services.AddSingleton(Mock.Of <IUserClaimsPrincipalFactory <ApplicationUser> >(MockBehavior.Strict)); services.AddSzlemRecruitmentImpl(config); services.AddSingleton(Moq.Mock.Of <DependentServices.IEditionProvider>(Moq.MockBehavior.Strict)); services.AddSingleton(Moq.Mock.Of <DependentServices.ITrainerProvider>(Moq.MockBehavior.Strict)); services.AddSingleton(Moq.Mock.Of <Szlem.Engine.Infrastructure.IRequestAuthorizationAnalyzer>(Moq.MockBehavior.Strict)); services.AddSingleton <IFluidTemplateRenderer, FluidTemplateRenderer>(); services.AddSingleton <IEmailService, SucceedingEmailService>(); services.AddEventInitializer(); var mockRunner = new Mock <FluentMigrator.Runner.IMigrationRunner>(); mockRunner.Setup(runner => runner.MigrateUp()); services.AddSingleton <FluentMigrator.Runner.IMigrationRunner>(mockRunner.Object); var domainAssembly = typeof(Szlem.Recruitment.Impl.Marker).Assembly; services.AddEventFlow(options => options .AddAspNetCore() .ConfigureJson(jsonConfig => jsonConfig .AddSingleValueObjects() .Configure(serializer => serializer .ConfigureForNodaTime(NodaTime.DateTimeZoneProviders.Tzdb) .ConstructorHandling = Newtonsoft.Json.ConstructorHandling.AllowNonPublicDefaultConstructor)) .Configure(config => config.ThrowSubscriberExceptions = true) ); registerServices?.Invoke(services); var sp = services.BuildServiceProvider(); using (var scope = sp.CreateScope()) { scope.ServiceProvider.GetRequiredService <DbSessionProvider>().UnsafeCleanAndRebuildSchema(); var initializers = scope.ServiceProvider.GetRequiredService <IEnumerable <IAsyncInitializer> >(); foreach (var initializer in initializers) { initializer.InitializeAsync().Wait(); } } foreach (var hostedService in sp.GetServices <Microsoft.Extensions.Hosting.IHostedService>()) { hostedService.StartAsync(System.Threading.CancellationToken.None).Wait(); } return(sp); }