private async Task OnExecuteAsync() { var services = new ServiceCollection(); var toolsOption = GetToolsOptions(ConfigFilePath); ConventionPackDefault.Register(); MongoDbRegistry.RegisterEntities(); var dbType = DatabseType.ToEnum <ConnectionType>(true); var databaseOption = new DatabaseOptions { ConnectionString = !string.IsNullOrEmpty(Connection) ? Connection : GetDefaultConnectionString(dbType, App, toolsOption), ConnectionType = dbType }; var runningCommand = GetAvailableCommands().FirstOrDefault(a => a.CommandName.ToLower() == Command.ToLower()); if (runningCommand != null) { ToolsContext toolsContext = null; var storingConnections = toolsOption.GetByDatabaseType(dbType); switch (dbType) { case ConnectionType.MongoDB: var mongoConnection = new MongoConnection(databaseOption); var mongoVersionContext = new MongoVersionContext(databaseOption); var versionMongoRepository = new VersionMongoRepository(mongoConnection); mongoVersionContext.ConnectionType = ConnectionType.MongoDB; mongoVersionContext.DatabaseOptions = databaseOption; mongoVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection; mongoVersionContext.IdentityDbOptions = storingConnections.IdentityConnection; var latestVersion = versionMongoRepository.GetAsQueryable().ToList().LastOrDefault(); var allVersions = Enumerable.Empty <IVersion>(); IServiceProvider serviceProvider = null; if (IsPortal()) { RegisterServicesForPortal(services, databaseOption); serviceProvider = services.BuildServiceProvider(); allVersions = Scanner.GetAllPortalVersions(serviceProvider); } else if (IsIdentity()) { RegisterServicesForIdentity(services, databaseOption); serviceProvider = services.BuildServiceProvider(); allVersions = Scanner.GetAllIdentityVersions(serviceProvider); } toolsContext = new ToolsContext { LatestVersion = latestVersion, VersionContext = mongoVersionContext, VersionNumber = VersionNumber, Versions = allVersions, VersionRepository = versionMongoRepository, PatchesFolder = PatchesFolder, AllowPatch = !string.IsNullOrEmpty(PatchesFolder), Services = serviceProvider, Arguments = CombineArguments() }; break; case ConnectionType.PostgreSQL: case ConnectionType.MySQL: case ConnectionType.SQLServer: if (IsPortal()) { #pragma warning disable CA2000 // Dispose objects before losing scope var letportalContext = new PortalDbContext(databaseOption); #pragma warning restore CA2000 // Dispose objects before losing scope letportalContext.Database.EnsureCreated(); #pragma warning disable CA2000 // Dispose objects before losing scope var letportalContextForRepo = new PortalDbContext(databaseOption); #pragma warning restore CA2000 // Dispose objects before losing scope var sqlEFVersionContext = new EFVersionContext(letportalContext) { ConnectionType = dbType, DatabaseOptions = databaseOption }; var portalVersionRepository = new VersionEFRepository(letportalContextForRepo); var latestVersionEF = portalVersionRepository.GetAsQueryable().ToList().LastOrDefault(); sqlEFVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection; sqlEFVersionContext.IdentityDbOptions = storingConnections.IdentityConnection; RegisterServicesForPortal(services, databaseOption); var sqlServiceProvider = services.BuildServiceProvider(); IEnumerable <IVersion> allSQLVersions = Scanner.GetAllPortalVersions(sqlServiceProvider); toolsContext = new ToolsContext { LatestVersion = latestVersionEF, VersionContext = sqlEFVersionContext, VersionNumber = VersionNumber, Versions = allSQLVersions, VersionRepository = portalVersionRepository, Services = sqlServiceProvider, AllowPatch = !string.IsNullOrEmpty(PatchesFolder), Arguments = CombineArguments() }; } else if (IsIdentity()) { #pragma warning disable CA2000 // Dispose objects before losing scope var letIdentityContext = new IdentityDbContext(databaseOption); #pragma warning restore CA2000 // Dispose objects before losing scope letIdentityContext.Database.EnsureCreated(); #pragma warning disable CA2000 // Dispose objects before losing scope var letportalContextForRepo = new IdentityDbContext(databaseOption); #pragma warning restore CA2000 // Dispose objects before losing scope var sqlEFVersionContext = new EFVersionContext(letportalContextForRepo) { ConnectionType = dbType, DatabaseOptions = databaseOption }; var portalVersionRepository = new VersionEFRepository(letportalContextForRepo); var latestVersionEF = portalVersionRepository.GetAsQueryable().ToList().LastOrDefault(); sqlEFVersionContext.ServiceManagementOptions = storingConnections.ServiceManagementConnection; sqlEFVersionContext.IdentityDbOptions = storingConnections.IdentityConnection; RegisterServicesForIdentity(services, databaseOption); var sqlServiceProvider = services.BuildServiceProvider(); IEnumerable <IVersion> allSQLVersions = Scanner.GetAllIdentityVersions(sqlServiceProvider); toolsContext = new ToolsContext { LatestVersion = latestVersionEF, VersionContext = sqlEFVersionContext, VersionNumber = VersionNumber, Versions = allSQLVersions, VersionRepository = portalVersionRepository, AllowPatch = !string.IsNullOrEmpty(PatchesFolder), Services = sqlServiceProvider }; } break; } if (toolsContext != null) { Console.WriteLine(""); await runningCommand.RunAsync(toolsContext); toolsContext.Dispose(); } Console.WriteLine("-----------------------++++++DONE++++++-------------------------"); } else { Console.WriteLine("Oops! We don't find any matching command to execute. If you don't know how to run, please type '--help'"); } Console.ReadLine(); }