예제 #1
0
        /// <summary>
        /// Builds the IServiceProvider for the application and registers available services.
        /// </summary>
        private static void BuildAndRegisterServices()
        {
            IConfigurationRoot config = Program.Configuration;

            if (config == null)
            {
                throw new InvalidOperationException("Application Configuration is null. You must call BuildConfiguration() before calling this method.");
            }
            System.Console.WriteLine($"Connection string: {config["Data:ptvdb:ConnectionString"]}");

            var srvcol = new ServiceCollection();

            srvcol.AddLogging();

            // register console apps db context
            srvcol.AddEntityFrameworkNpgsql().AddDbContext <SourceDbContext>(options => options.UseNpgsql(Program.Configuration[ConfigKeys.SourceConnectionString]));
            srvcol.AddDbContext <SourceDbContext>(options => options.UseNpgsql(Program.Configuration[ConfigKeys.SourceConnectionString]));
            // register ptv db context and PTV services
            RegisterServiceManager.RegisterFromAllAssemblies(srvcol);
            RegisterDataProviderServices.RegisterFromAssembly(srvcol);
            BaseEntityCloners.RegisterBaseEntityCloners(srvcol);
            FrameworksInitializer.RegisterEntityFramework(srvcol, Program.Configuration[ConfigKeys.PTVConnectionString]);

            // for now make it behave like this..
            srvcol.AddTransient <ISourceRepository, SourceRepository>();
            srvcol.AddTransient <IFakePtvRepository, FakePtvJsonFileRepository>();
            srvcol.AddTransient <IHttpContextAccessor, FakeHttpContext>();
            srvcol.AddTransient <IHostingEnvironment, FakeHostingEnv>();
            srvcol.AddSingleton(new ApplicationConfiguration(config));

            Program.ServiceProvider = srvcol.BuildServiceProvider();
        }
예제 #2
0
        /// <summary>
        /// Builds the IServiceProvider for the application and registers available services.
        /// </summary>
        private static void BuildAndRegisterServices()
        {
            IConfigurationRoot config = Configuration;

            if (config == null)
            {
                throw new InvalidOperationException("Application Configuration is null. You must call BuildConfiguration() before calling this method.");
            }
            Console.WriteLine($"Connection string: {config["Data:ptvdb:ConnectionString"]}");

            var services = new ServiceCollection();

            services.AddLogging();

            // register ptv db context and PTV services
            RegisterServiceManager.RegisterFromAllAssemblies(services);
            FrameworksInitializer.RegisterEntityFramework(services, Configuration["Data:ptvdb:ConnectionString"]);
            services.Configure <AppSettings>(options => Configuration.GetSection("AppSettings").Bind(options));
            services.AddSingleton <IConfiguration>(Configuration);
            services.AddOptions();
            services.AddTransient <IDataHandler, DataHandler>();
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.AddTransient <IUserIdentification, UserIdentification>();
            //services.AddTransient<IOrganizationService, OrganizationService>();
            //services.AddTransient<IServiceService, ServiceService>();
            //services.AddTransient<IChannelService, ChannelService>();
            //services.AddTransient<IGeneralDescriptionService, GeneralDescriptionService>();
            services.AddSingleton(new ApplicationConfiguration(config));
            ServiceProvider = services.BuildServiceProvider();
        }
예제 #3
0
        /// <summary>
        /// This method gets called by the runtime. Use this method to add services to the container.
        /// </summary>
        /// <param name="services">object responsible for registering of the assemblies</param>
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddMvcCore().AddJsonFormatters();
            //services.AddMvcCore();
            //services.AddAuthorization();
            services.AddSingleton(PtvConfiguration);
            services.AddOptions();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("ui", new Info()
                {
                    Title = "PTV UI API", Version = "ui", Description = "PTV UI Web API",
                });
                var developmentPath = string.Format(Path.Combine(appEnv.ContentRootPath, "bin", "Debug", "netcoreapp1.1"));

                var xmlCommentPath = Path.Combine(appEnv.ContentRootPath, @"PTV.Application.Api.xml");
                var modelsXmlPath  = Path.Combine(appEnv.ContentRootPath, @"PTV.Domain.Model.xml");

                c.DescribeAllEnumsAsStrings();

                if (!File.Exists(xmlCommentPath) || !File.Exists(modelsXmlPath))
                {
                    xmlCommentPath = Path.Combine(developmentPath, @"PTV.Application.Api.xml");
                    modelsXmlPath  = Path.Combine(developmentPath, @"PTV.Domain.Model.xml");
                }

                if (!File.Exists(xmlCommentPath) || !File.Exists(modelsXmlPath))
                {
                    return;
                }

                c.IncludeXmlComments(xmlCommentPath);
                c.IncludeXmlComments(modelsXmlPath);
            });
            //services.AddCors();
            services.Configure <CookieAuthenticationOptions>(options => Configuration.GetSection("Data:CookieAuthenticationConfigurations").Bind(options));
            services.Configure <OpenIdConnectOptions>(options => Configuration.GetSection("Data:OpenIDConnectConfigurations").Bind(options));
            //services.Configure<OAuthOptions>(options => Configuration.GetSection("Data:OpenIDConnectConfigurations").Bind(options));
            services.Configure <IdentityServerAuthenticationOptions>(options => Configuration.GetSection("Data:IdentityServerAuthenticationConfigurations").Bind(options));
            services.Configure <ProxyServerSettings>(options => Configuration.GetSection("Data:ProxyServerSettings").Bind(options));
            services.Configure <DataContextOptions>(options => Configuration.GetSection("Data:DataContextOptions").Bind(options));
            services.Configure <AnnotationServiceConfiguration>(options => Configuration.GetSection("Data:AnnotationService").Bind(options));
            services.Configure <MapServiceConfiguration>(options => Configuration.GetSection("Data:MapService").Bind(options));
            services.Configure <TestAccessUrlConfiguration>(options => Configuration.GetSection("Data:TestInternetAccess").Bind(options));
            services.Configure <MapDNSes>(options => Configuration.GetSection("ApplicationConfiguration:MapDNSNames").Bind(options));
            services.Configure <RequestFilterAppSetting>(options => Configuration.GetSection("RequestFilter").Bind(options));
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            RegisterServiceManager.RegisterFromAllAssemblies(services);
            BaseEntityCloners.RegisterBaseEntityCloners(services);
            RegisterDataProviderServices.RegisterFromAssembly(services);
            // Add framework services.
            FrameworksInitializer.RegisterEntityFramework(services, Configuration["Data:DefaultConnection:ConnectionString"]);
        }
예제 #4
0
 // This method gets called by the runtime. Use this method to add services to the container.
 public void ConfigureServices(IServiceCollection services)
 {
     services.AddMvc().AddJsonOptions(i => i.SerializerSettings.Error += JsonError);
     services.AddWebpack();
     services.AddSingleton(PtvConfiguration);
     services.AddOptions();
     services.Configure <CookieAuthenticationOptions>(options => Configuration.GetSection("Data:CookieAuthenticationConfigurations").Bind(options));
     services.Configure <OpenIdConnectOptions>(options => Configuration.GetSection("Data:OpenIDConnectConfigurations").Bind(options));
     services.Configure <IdentityServerAuthenticationOptions>(options => Configuration.GetSection("Data:IdentityServerAuthenticationConfigurations").Bind(options));
     services.Configure <ProxyServerSettings>(options => Configuration.GetSection("Data:ProxyServerSettings").Bind(options));
     services.Configure <DataContextOptions>(options => Configuration.GetSection("Data:DataContextOptions").Bind(options));
     services.Configure <AnnotationServiceConfiguration>(options => Configuration.GetSection("Data:AnnotationService").Bind(options));
     services.Configure <MapServiceConfiguration>(options => Configuration.GetSection("Data:MapService").Bind(options));
     services.Configure <MapDNSes>(options => Configuration.GetSection("ApplicationConfiguration:MapDNSNames").Bind(options));
     services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
     RegisterServiceManager.RegisterFromAllAssemblies(services);
     BaseEntityCloners.RegisterBaseEntityCloners(services);
     RegisterDataProviderServices.RegisterFromAssembly(services);
     FrameworksInitializer.RegisterEntityFramework(services, Configuration["Data:DefaultConnection:ConnectionString"]);
 }
예제 #5
0
        /// <summary>
        /// Configure and register all services needed for application
        /// </summary>
        /// <param name="services"></param>
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton(PtvConfiguration);
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.AddSingleton(Configuration);
            RegisterServiceManager.RegisterFromAllAssemblies(services);
            RegisterDataProviderServices.RegisterFromAssembly(services);
            FrameworksInitializer.RegisterEntityFramework(services, Configuration.GetConnectionString("QuartzConnection"));

            // Add framework services.
            services.AddMvc().AddJsonOptions(options =>
            {
                options.SerializerSettings.Formatting            = Formatting.Indented;
                options.SerializerSettings.Culture               = CultureInfo.InvariantCulture;
                options.SerializerSettings.DateFormatHandling    = DateFormatHandling.IsoDateFormat;
                options.SerializerSettings.DateParseHandling     = DateParseHandling.DateTime;
                options.SerializerSettings.DateTimeZoneHandling  = DateTimeZoneHandling.Utc;
                options.SerializerSettings.NullValueHandling     = NullValueHandling.Include;
                options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
                options.SerializerSettings.ContractResolver      = new CamelCasePropertyNamesContractResolver();
            });
        }
예제 #6
0
        public static void ProcessMenuAction(ProgramMenuOption userMenuAction, ILogger logger)
        {
            Console.WriteLine($"Calling '{userMenuAction}'...");
            switch (userMenuAction)
            {
            case ProgramMenuOption.InitialPtvCreate:
                Stopwatch sw      = new Stopwatch();
                Stopwatch swTotal = new Stopwatch();
                swTotal.Start();

                // create and apply migrations
                System.Console.WriteLine("Creating new database...");
                sw.Start();
                FrameworksInitializer.DoMigration(Program.ServiceProvider);
                sw.Stop();
                string msg = $"Database created in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();

                // seed system data
                System.Console.WriteLine("Seeding system data to database..");
                sw.Restart();
                FrameworksInitializer.SeedDatabase(Program.ServiceProvider);
                sw.Stop();
                msg = $"System data seeded to database in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();

                // Seed finto data
                System.Console.WriteLine("Seeding finto data..");
                sw.Restart();
                ImportFintoDataTask fintoTask = new ImportFintoDataTask(Program.ServiceProvider);
                fintoTask.ImportData();
                sw.Stop();
                System.Console.WriteLine();
                msg = $"Finto items imported in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();

                // Seed digital authorizations
                System.Console.WriteLine("Seeding digital authorizations..");
                sw.Restart();
                var importDigitalAuthorizations = new DownloadAndImportDigitalAuthorizationsTask(ServiceProvider);
                importDigitalAuthorizations.ImportDigitalAuthorizations();
                sw.Stop();
                System.Console.WriteLine();
                msg = $"Digital authorization items imported in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();

                // Create organizations for municipalities
                System.Console.WriteLine("Creating organizations for municipalities..");
                sw.Restart();
                CreateMunicipalityOrganizationsTask munOrgTask = new CreateMunicipalityOrganizationsTask(Program.ServiceProvider);
                munOrgTask.Create();
                sw.Stop();
                System.Console.WriteLine();
                msg = $"Organizations for municipalities created in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();

                // import general descriptions
                System.Console.WriteLine("Importing general descriptions from JSON file..");
                sw.Restart();
                UpdateCreateGeneralDescriptionsTask generalDescriptionsTask = new UpdateCreateGeneralDescriptionsTask(ServiceProvider);
                generalDescriptionsTask.ImportDataFromJSON();
                CreateServiceDataForGeneralDescriptionsJsonTask createServicesDescTask = new CreateServiceDataForGeneralDescriptionsJsonTask(Program.ServiceProvider);
                createServicesDescTask.ImportDataFromJSON();
                sw.Stop();
                System.Console.WriteLine();
                msg = $"General descriptions imported in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();

                // import fake ptv data from json
                System.Console.WriteLine("Starting fake PTV import..");
                sw.Restart();
                ImportTask fakeit = new ImportTask(Program.ServiceProvider);
                fakeit.ImportFakePtv();
                sw.Stop();
                msg = $"Fake PTV import complete in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();
                var languagesAndVersionsTask = new UpdateLangaugeAvailabilitiesAndVersions(Program.ServiceProvider);
                languagesAndVersionsTask.CheckAndUpdateLangaugeAvailabilitiesAndVersions();
                //Update text description to Json
                var updateTextDescriptionTask = new UpdateTextDescriptionToJsonTask(Program.ServiceProvider);
                updateTextDescriptionTask.CheckAndUpdateTextDescriptionToJson();

                swTotal.Stop();
                msg = $"Create, seed and import data, total time: {swTotal.Elapsed}";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();

                System.Console.WriteLine("See log files in /logs subfolder for details.");
                break;

            case ProgramMenuOption.CreateOrMigrateDatabase:
                // create and apply migrations
                System.Console.WriteLine("Applying migrations...");
                FrameworksInitializer.DoMigration(Program.ServiceProvider);
                System.Console.WriteLine("Database created.");
                break;

            case ProgramMenuOption.SeedSystemData:
                // seed system data
                System.Console.WriteLine("Seeding system data to database..");
                FrameworksInitializer.SeedDatabase(Program.ServiceProvider);
                System.Console.WriteLine("System data seeded to database.");
                break;

            case ProgramMenuOption.DownloadGeneralDescription:
                // import general descriptions
                System.Console.WriteLine("Downloading general descriptions from DB to file..");
                sw = new Stopwatch();
                sw.Restart();
                UpdateCreateGeneralDescriptionsTask downloadDescTask = new UpdateCreateGeneralDescriptionsTask(Program.ServiceProvider);
                downloadDescTask.DownloadFromDatabase();
                sw.Stop();

                System.Console.WriteLine();
                msg = $"General descriptions downloaded in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();
                break;

            case ProgramMenuOption.UpdateGeneralDescription:
                // import general descriptions
                System.Console.WriteLine("Importing general descriptions from JSON file..");
                sw = new Stopwatch();
                sw.Restart();
                UpdateCreateGeneralDescriptionsTask updateDescTask = new UpdateCreateGeneralDescriptionsTask(Program.ServiceProvider);
                updateDescTask.ImportDataFromJSON();
                sw.Stop();

                System.Console.WriteLine();
                msg = $"General descriptions imported in {sw.Elapsed}.";
                System.Console.WriteLine(msg);
                logger.LogInformation(msg);
                System.Console.WriteLine();
                break;

            case ProgramMenuOption.CreateMunicipalityOrganizations:
                System.Console.WriteLine("Creating Organizations for Municipalities.");
                CreateMunicipalityOrganizationsTask municipalityOrganizationsTask = new CreateMunicipalityOrganizationsTask(Program.ServiceProvider);
                municipalityOrganizationsTask.Create();
                break;

            //case ProgramMenuOption.ImportGeneralDescriptions:
            //    System.Console.WriteLine("Generating general descriptions JSON...");
            //    CreateGeneralDescriptionsJsonTask generalDescriptionTask = new CreateGeneralDescriptionsJsonTask(Program.ServiceProvider);
            //    generalDescriptionTask.Generate();
            //    System.Console.WriteLine("General descriptions JSON generation complete.");
            //    break;
            //case ProgramMenuOption.ImportFakePtv:
            //    System.Console.WriteLine("Starting fake PTV import..");
            //    ImportTask it = new ImportTask(Program.ServiceProvider);
            //    it.ImportFakePtv();
            //    System.Console.WriteLine("Fake PTV import complete.");
            //    break;
            case ProgramMenuOption.DumpFakePtv:
                System.Console.WriteLine("Starting to dump fake PTV to JSON files..");
                DumpFakePtvToFilesTask task = new DumpFakePtvToFilesTask(Program.ServiceProvider);
                task.WriteToFiles();
                System.Console.WriteLine("Fake PTV dumped to JSON files.");
                break;

            case ProgramMenuOption.ValidateFakePtvJson:
                System.Console.WriteLine("Starting to validate fake PTV generated JSON files to model..");

                try
                {
                    DumpFakePtvToFilesTask validationTask = new DumpFakePtvToFilesTask(Program.ServiceProvider);
                    validationTask.ValidateJson();
                    System.Console.WriteLine("Validation success.");
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine(ex.ToString());

                    System.Console.BackgroundColor = ConsoleColor.Red;
                    System.Console.Write("Error:");
                    System.Console.ResetColor();
                    System.Console.WriteLine($" check the SourceXXX model, {ex.Message}");
                }
                break;

            case ProgramMenuOption.CreatePostalCodesJson:
                System.Console.WriteLine("Generating postal codes JSON..");
                CreatePostalCodesJsonTask pct = new CreatePostalCodesJsonTask(Program.ServiceProvider);
                pct.Generate();
                System.Console.WriteLine("Postal codes JSON generation complete.");
                break;

            case ProgramMenuOption.ImportOrganizations:
                System.Console.WriteLine("Importing organizations JSON..");
                CreateOrganizationsJsonTask organizationTask = new CreateOrganizationsJsonTask(Program.ServiceProvider);
                organizationTask.ImportDataFromJSON();
                System.Console.WriteLine("Importing organizations complete.");
                break;

            case ProgramMenuOption.UpdateCoordinatesForAddress:
                System.Console.WriteLine("Updating addresses..");
                var addressTask = new UpdateCoordinatesForAddressesTask(Program.ServiceProvider);
                addressTask.UpdateAddresses();
                System.Console.WriteLine("Updating addresses complete.");
                break;

            case ProgramMenuOption.ImportOrUpdateFinto:
                System.Console.WriteLine("Importing finto data..");
                var fintoUpdateTask = new ImportFintoDataTask(Program.ServiceProvider);
                fintoUpdateTask.ImportData();
                System.Console.WriteLine("Importing finto data complete.");
                break;

            case ProgramMenuOption.DownloadFinto:
                System.Console.WriteLine("Importing finto data..");
                var downloadFintoTask = new DownloadFintoDataTask();
                downloadFintoTask.GetAllFintoData();
                System.Console.WriteLine("Importing finto data complete.");
                break;

            //                        case ProgramMenuOption.SwitchCoordinates:
            //                            System.Console.WriteLine("Switching coordinates..");
            //                            var addressSwitchTask = new UpdateCoordinatesForAddressesTask(Program.ServiceProvider);
            //                            addressSwitchTask.SwitchCoordinates();
            //                            System.Console.WriteLine("Switching coordinates complete.");
            //                            break;
            case ProgramMenuOption.UpdateLanguageAvailabilitiesAndVersions:
                var languagesAndVersions = new UpdateLangaugeAvailabilitiesAndVersions(Program.ServiceProvider);
                languagesAndVersions.CheckAndUpdateLangaugeAvailabilitiesAndVersions();
                break;

            case ProgramMenuOption.UpdateTextDescription:
                var updateTextDescription = new UpdateTextDescriptionToJsonTask(Program.ServiceProvider);
                updateTextDescription.CheckAndUpdateTextDescriptionToJson();
                break;

            case ProgramMenuOption.UpdateServiceDescriptionByGeneralDescription:
                Console.WriteLine($"Update operation can take few minutes...");
                var updateBackgroundGeneralDescription = new UpdateServiceDescriptionByGeneralDescriptionTask(Program.ServiceProvider);
                updateBackgroundGeneralDescription.CheckAndUpdateServiceDescriptionByGeneralDescription();
                Console.WriteLine("Update operation is complete.");
                break;

            case ProgramMenuOption.FindCyclicOrganizations:
                var findCylicOrganizationsTask = new FindCyclicOrganizationsTask(Program.ServiceProvider);
                findCylicOrganizationsTask.FindCyclicOrganizations();
                break;

            case ProgramMenuOption.DeleteOldData:
                var deleteOldDataTask = new DeleteOldDataTask(Program.ServiceProvider);
                deleteOldDataTask.DeleteOldData();
                break;

            case ProgramMenuOption.DownloadAndImportDigitalAuthorizations:
                var digitalAuthorizationsTask = new DownloadAndImportDigitalAuthorizationsTask(ServiceProvider);
                digitalAuthorizationsTask.DownloadAndImportDigitalAuthorizations();
                break;

            case ProgramMenuOption.FixFintoMerge:
                var fixFintoTask = new FixFintoTask(ServiceProvider);
                fixFintoTask.Apply();
                break;

            case ProgramMenuOption.DownloadPostalCodesFromCodeServiceTask:
                DownloadPostalCodesFromCodeServiceTask dpcTask = new DownloadPostalCodesFromCodeServiceTask(ServiceProvider);
                dpcTask.Download();
                break;

            case ProgramMenuOption.FixMultiPublishedEntities:
                FixMultiplePublishedEntitiesTask fixMultipleTask = new FixMultiplePublishedEntitiesTask(ServiceProvider);
                fixMultipleTask.Apply();
                break;

//                case ProgramMenuOption.PrintGDwithoutLaw:
//                    PrintGdWithoutLaw printGd = new PrintGdWithoutLaw(ServiceProvider);
//                    printGd.Apply();
//                    break;
            case ProgramMenuOption.CopyLawsFromArchivedToPublishedGeneralDescs:
                CopyLawsOfGeneralDescs copyLaws = new CopyLawsOfGeneralDescs(ServiceProvider);
                copyLaws.Apply();
                break;

//                case ProgramMenuOption.PrintMissingGDSWELaws:
//                    CopyLawsOfGeneralDescs copyLaws2 = new CopyLawsOfGeneralDescs(ServiceProvider);
//                    copyLaws2.PrintMissingSweLaws();
//                    break;
            default:
                break;
            }
        }
예제 #7
0
        /// <summary>
        /// Configure and register all services needed for application
        /// </summary>
        /// <param name="services"></param>
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc(
                c => c.Conventions.Add(new ControllerModelRemoveVersionPrefixConvention())
                );
            services.AddMvcCore().AddJsonFormatters();
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.AddSingleton <IConfigurationRoot>(Configuration);
            services.Configure <AppSettings>(options => Configuration.GetSection("AppSettings").Bind(options));

            services.AddSingleton(PtvConfiguration);
            services.Configure <CookieAuthenticationOptions>(options => Configuration.GetSection("Data:CookieAuthenticationConfigurations").Bind(options));
            services.Configure <OpenIdConnectOptions>(options => Configuration.GetSection("Data:OpenIDConnectConfigurations").Bind(options));
            services.Configure <IdentityServerAuthenticationOptions>(options => Configuration.GetSection("Data:IdentityServerAuthenticationConfigurations").Bind(options));
            services.Configure <ProxyServerSettings>(options => Configuration.GetSection("Data:ProxyServerSettings").Bind(options));
            services.Configure <DataContextOptions>(options => Configuration.GetSection("Data:DataContextOptions").Bind(options));
            services.Configure <AnnotationServiceConfiguration>(options => Configuration.GetSection("Data:AnnotationService").Bind(options));
            services.Configure <MapServiceConfiguration>(options => Configuration.GetSection("Data:MapService").Bind(options));
            services.Configure <TestAccessUrlConfiguration>(options => Configuration.GetSection("Data:TestInternetAccess").Bind(options));
            services.Configure <MapDNSes>(options => Configuration.GetSection("ApplicationConfiguration:MapDNSNames").Bind(options));
            services.Configure <RequestFilterAppSetting>(options => Configuration.GetSection("RequestFilter").Bind(options));
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            RegisterServiceManager.RegisterFromAllAssemblies(services);
            BaseEntityCloners.RegisterBaseEntityCloners(services);
            RegisterDataProviderServices.RegisterFromAssembly(services);
            FrameworksInitializer.RegisterEntityFramework(services, Configuration["Data:DefaultConnection:ConnectionString"]);
            services.AddSwaggerGen(
                c => {
                c.SwaggerDoc("v4", new Info
                {
                    Version     = "v4",
                    Title       = "PTV Open Api version 4",
                    Description = "Here you can see listed all the PTV Open Api methods."
                });
                c.SwaggerDoc("v5", new Info
                {
                    Version     = "v5",
                    Title       = "PTV Open Api version 5",
                    Description = "Here you can see listed all the PTV Open Api methods."
                });
                c.SwaggerDoc("v6", new Info
                {
                    Version     = "v6",
                    Title       = "PTV Open Api version 6",
                    Description = "Here you can see listed all the PTV Open Api methods."
                });
                c.SwaggerDoc("v7", new Info
                {
                    Version     = "v7",
                    Title       = "PTV Open Api version 7",
                    Description = "Here you can see listed all the PTV Open Api methods."
                });


                c.OperationFilter <SecurityRequirementsOperationFilter>();
                c.DocInclusionPredicate((version, apiDescription) => ResolveVersionSupportByRouteConstraint(apiDescription, version));
                c.SchemaFilter <SwaggerSchemaFilter>();

                // TODO: PTV-1556:
                //c.DocumentFilter<SwaggerDocumentFilter>();

                // Define the OAuth2.0 scheme that's in use (i.e. Implicit Flow)
                c.AddSecurityDefinition("oauth2", new OAuth2Scheme
                {
                    Type             = "oauth2",
                    Flow             = "implicit",
                    AuthorizationUrl = $"{Configuration["STS"]}/connect/authorize",
                    Scopes           = new Dictionary <string, string>
                    {
                        { "dataEventRecords", "Access event records" }
                    }
                });
            });

            var path           = appEnv.IsDevelopment() ? Path.Combine(appEnv.ContentRootPath, "bin", "Debug", @"netcoreapp1.1") : appEnv.ContentRootPath;
            var xmlCommentPath = Path.Combine(path, @"PTV.Application.OpenApi.xml");
            var modelsXmlPath  = Path.Combine(path, @"PTV.Domain.Model.xml");

            services.ConfigureSwaggerGen(options =>
            {
                options.DescribeAllEnumsAsStrings();
                options.IncludeXmlComments(xmlCommentPath);
                if (File.Exists(modelsXmlPath))
                {
                    options.IncludeXmlComments(modelsXmlPath);
                }
            });
        }