예제 #1
0
        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();
        }