// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            ConfigureDI(services);

            services.AddCors(); // disable to enforce strict security on app


            // connect to SQL Server database
            string conn = Configuration.GetConnectionString("DDD.Conn");

            services.AddDbContext <AppDbContext>(opt =>
            {
                opt.UseSqlServer(conn);
                opt.EnableSensitiveDataLogging(); // turn off as required to keep logs cleaner
            });

            services.AddLogging();

            // register HealthCheck services
            services.AddHealthChecks()
            .AddDbContextCheck <AppDbContext>("SQL Server Database")
            .AddCheck <ThirdPartyServiceHealthCheck>("ThirdParty Services")
            .AddCheck <PaymentGatewayHealthCheck>("Payment Gateway");


            services.AddAuthentication("Bearer")
            .AddJwtBearer("Bearer", options =>
            {
                options.Authority            = "APIStore";
                options.RequireHttpsMetadata = false;
                options.Audience             = "APIStore";
            });

            // load clients into app memory
            // on add of new client, service must be restarted

            var clients = new List <AppClient>();

            Configuration.GetSection("AppClients").Bind(clients);
            services.AddSingleton(clients);

            services.AddAuthorization(opt =>
            {
                opt.DefaultPolicy = new AuthorizationPolicyBuilder()
                                    .AddRequirements(new APIKeyStore(AppClient.LoadClients(clients)))
                                    .Build();
            });

            // setup Swagger
            ConfigureSwagger(services);
        }