async Task <string> SetUpInternalAsync(SetUpContext context) { // Set shell state to "Initializing" so that subsequent HTTP requests are responded to with "Service Unavailable" while Orchard is setting up. _shellSettings.State = TenantState.Initializing; var executionId = Guid.NewGuid().ToString("n"); var shellSettings = new ShellSettings(_shellSettings.Configuration); shellSettings.Name = context.SiteName; shellSettings.Location = context.SiteName.ToSafeFileName(); if (string.IsNullOrEmpty(shellSettings.DatabaseProvider)) { var tablePrefix = context.DatabaseTablePrefix; if (!tablePrefix.EndsWith(TablePrefixSeparator)) { tablePrefix += TablePrefixSeparator; } shellSettings.DatabaseProvider = context.DatabaseProvider; shellSettings.ConnectionString = context.DatabaseConnectionString; shellSettings.TablePrefix = tablePrefix; } using (var shellContext = _shellContextFactory.CreateMinimalShellContext(shellSettings)) { using (var scope = shellContext.ServiceProvider.CreateScope()) { using (var dbContext = scope.ServiceProvider.GetRequiredService <IDbContext>()) { // update dbContext confirmation dbContext.Configure(options => { options.ConnectionString = shellSettings.ConnectionString; options.DatabaseProvider = shellSettings.DatabaseProvider; options.TablePrefix = shellSettings.TablePrefix; }); var hasErrors = false; void ReportError(string key, string message) { hasErrors = true; context.Errors[key] = message; } // Invoke modules to react to the setup event var setupEventHandlers = scope.ServiceProvider.GetServices <ISetUpEventHandler>(); var logger = scope.ServiceProvider.GetRequiredService <ILogger <SetUpService> >(); await setupEventHandlers.InvokeAsync(x => x.SetUp(context, ReportError), logger); if (hasErrors) { return(executionId); } } } } if (context.Errors.Count > 0) { return(executionId); } shellSettings.State = TenantState.Running; _platoHost.UpdateShellSettings(shellSettings); return(executionId); }