예제 #1
0
파일: Program.cs 프로젝트: yuzd/lamar
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddMvc();
            services.AddLogging();
            services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients());

            services.For <IMessageMaker>().Use(new MessageMaker("Hey there."));

            services.AddAuthentication()
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority            = "auth";
                options.RequireHttpsMetadata = true;
            })


            .AddFacebook(facebookOptions =>
            {
                facebookOptions.AppId     = "something";
                facebookOptions.AppSecret = "else";
            });
        }
예제 #2
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddLogging();

            services.AddCommandr();
            services.For <ICommandBus>().Use <JasperCommandBus>();
        }
예제 #3
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddOptions();
            services.Configure <KafkaOptions>(Configuration.GetSection("Kafka"));


            services.AddControllers();

            services.AddMvc()
            .AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = true; });
            services.AddLogging();

            services.AddRouting(option => { option.LowercaseUrls = true; });

            services.For <IMediator>().Use <Mediator>().Transient();
            services.For <ServiceFactory>().Use(ctx => ctx.GetInstance);
            services.AddCors(options => { options.AddDefaultPolicy(builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); });

            //Kafka
            services.For(typeof(IKafkaPublisher <>)).Add(typeof(KafkaPublisher <>)).Scoped();
            services.AddHostedService <BaselineListener>();

            services.AddTransient <IUserInput, UserInput>();
            services.AddTransient <ITradeAlgorithm, TradeAgorithm>();

            services.AddMemoryCache();
        }
예제 #4
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            // Supports ASP.Net Core DI abstractions

            services.AddMvc().AddControllersAsServices().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddLogging();
            services.IncludeRegistry <ApplicationServiceRegistry>();

            //  service.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
        }
예제 #5
0
 public void ConfigureContainer(ServiceRegistry services)
 {
     services.AddMvc();
     services.AddLogging();
     services.AddIdentityServer()
     .AddDeveloperSigningCredential()
     .AddInMemoryApiResources(Config.GetApiResources())
     .AddInMemoryClients(Config.GetClients());
     services.For <IMessageMaker>().Use(new MessageMaker("Hey there."));
 }
예제 #6
0
        private void AddTestRegistrations(ServiceRegistry services,
                                          IWebHostEnvironment hostingEnvironment)
        {
            services.AddLogging();
            DiagnosticListener diagnosticSource = new DiagnosticListener(hostingEnvironment.ApplicationName);

            services.AddSingleton <DiagnosticSource>(diagnosticSource);
            services.AddSingleton <DiagnosticListener>(diagnosticSource);
            services.AddSingleton <IWebHostEnvironment>(hostingEnvironment);
        }
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddLogging();
            services.AddMultitenancy <Tenant, DefaultTenantResolver>();
            services.AddDbContext <TenantDbContext>(options => {
            });

            services.Scan(scanner =>
            {
                // scanner.AssembliesFromApplicationBaseDirectory();
                scanner.TheCallingAssembly();
                scanner.WithDefaultConventions();
            });
        }
예제 #8
0
        // Take in Lamar's ServiceRegistry instead of IServiceCollection
        // as your argument, but fear not, it implements IServiceCollection
        // as well
        public void ConfigureContainer(ServiceRegistry services)
        {
            // Supports ASP.Net Core DI abstractions
            services.AddMvc();
            services.AddLogging();

            // Also exposes Lamar specific registrations
            // and functionality
            services.Scan(s =>
            {
                s.TheCallingAssembly();
                s.WithDefaultConventions();
            });
        }
예제 #9
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            // Supports ASP.Net Core DI abstractions
            services.AddOptions();
            services.Configure <KafkaOptions>(Configuration.GetSection("Kafka"));
            services.AddSwaggerGen(c => {
                c.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "Order APIs", Version = "v1"
                });
            });

            services.AddEntityFrameworkSqlServer()
            .AddDbContext <OrdersDBContext>(options =>
            {
                options.UseSqlServer(Configuration["ConnectionString"],
                                     sqlServerOptionsAction: sqlOptions =>
                {
                    sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
                    sqlOptions.EnableRetryOnFailure(maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(1),
                                                    errorNumbersToAdd: null);
                });
            });
            services.AddMvc()
            .AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = true; });
            services.AddLogging();
            services.AddControllers();
            services.Scan(scanner =>
            {
                scanner.AssemblyContainingType <CreateOrderCommand>();
                scanner.AssemblyContainingType <CreateItemCommand>();
                scanner.AssemblyContainingType <CreateItemsCommand>();
                scanner.AssemblyContainingType <RollbackOrderCommand>();
                scanner.AssemblyContainingType <GetItemQuery>();
                scanner.AssemblyContainingType <GetItemsQuery>();
                scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler <,>));
            });
            services.For <IMediator>().Use <Mediator>().Transient();
            services.For <ServiceFactory>().Use(ctx => ctx.GetInstance);
            services.For(typeof(IItemRepository)).Add(typeof(ItemRepository)).Singleton();
            services.For(typeof(IOrderRepository)).Add(typeof(OrderRepository)).Singleton();
            services.For(typeof(IKafkaProducer <>)).Add(typeof(KafkaProducer <>)).Singleton();
            services.For(typeof(IKafkaSubscriber <>)).Add(typeof(KafkaSubscriber <>)).Singleton();
            services.For(typeof(IKafkaMessageService <,>)).Add(typeof(KafkaMessageService <,>)).Singleton();

            services.AddCors(options => { options.AddDefaultPolicy(builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); });
            // services.AddHostedService<PaymentBackgroundAvroService>();
            // services.AddHostedService<PaymentBackgroundJsonService>();
        }
예제 #10
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddControllers();
            services.Configure <AppSettings>(Configuration.GetSection("AppSettings"));
            services.AddCors();
            services.AddLogging();

            services.Scan(s =>
            {
                s.TheCallingAssembly();
                s.WithDefaultConventions();
                s.AssemblyContainingType <CommonRegistry>();
                s.AssemblyContainingType <ServicesRegistry>();
                s.AssemblyContainingType <DefaultRegistry>();
            });
        }
예제 #11
0
파일: Startup.cs 프로젝트: JasperFx/lamar
        // Take in Lamar's ServiceRegistry instead of IServiceCollection
        // as your argument, but fear not, it implements IServiceCollection
        // as well
        public void ConfigureContainer(ServiceRegistry services)
        {
            // Supports ASP.Net Core DI abstractions
            services.AddMvc();
            services.AddLogging();

            // Also exposes Lamar specific registrations
            // and functionality
            services.Scan(s =>
            {
                s.TheCallingAssembly();
                s.WithDefaultConventions();
            });


            // This adds Lamar's validation to the
            // Oakton.AspNetCore environment check support
            services.CheckLamarConfiguration();
        }
예제 #12
0
        /*
         * public Startup(IConfiguration configuration)
         * {
         * Configuration = configuration;
         * }
         *
         * public IConfiguration Configuration { get; }
         *
         * // This method gets called by the runtime. Use this method to add services to the container.
         * public void ConfigureServices(IServiceCollection services)
         * {
         * services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
         * services.AddSwaggerGen(c =>
         * {
         * c.SwaggerDoc("v1", new Info { Title = "Player API", Version = "v1" });
         * });
         * }
         */

        public void ConfigureContainer(ServiceRegistry services)
        {
            // Supports ASP.Net Core DI abstractions
            services.AddMvc(options =>
            {
                //options.OutputFormatters.Add(new HalOutputFormatter(new JsonSerializerSettings(), System.Buffers.ArrayPool<char>.Shared));
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddLogging();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info {
                    Title = "Player API", Version = "v1"
                });
            });

            // Also exposes Lamar specific registrations
            // and functionality
            services.Scan(s =>
            {
                s.TheCallingAssembly();
                s.AssembliesFromApplicationBaseDirectory(x => x.FullName.Contains("HowToHATEOAS"));
                s.LookForRegistries();
                s.WithDefaultConventions();
            });

            //services.AddAutoMapper(;

            // RiskFirst.Hateoas configuration
            services.AddLinks(config =>
            {
                config.AddPolicy <Player>(policy =>
                {
                    policy
                    //.RequireSelfLink()
                    .RequireRoutedLink("all", "GetPlayers")
                    .RequireRoutedLink("status_active", "UpdatePlayerStatus", x => new { id = x.Id, status = "1" }, c => c.Assert(x => x.AvailableStatuses.Any(y => y.Id == 1)))
                    .RequireRoutedLink("status_injured", "UpdatePlayerStatus", x => new { id = x.Id, status = "2" }, c => c.Assert(x => x.AvailableStatuses.Any(y => y.Id == 2)))
                    .RequireRoutedLink("status_suspended", "UpdatePlayerStatus", x => new { id = x.Id, status = "3" }, c => c.Assert(x => x.AvailableStatuses.Any(y => y.Id == 3)))
                    .RequireRoutedLink("status_retired", "UpdatePlayerStatus", x => new { id = x.Id, status = "4" }, c => c.Assert(x => x.AvailableStatuses.Any(y => y.Id == 4)));
                });
            });
        }
예제 #13
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddMvc();
            services.AddLogging();
            services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients());
            services.For <IMessageMaker>().Use(new MessageMaker("Hey there."));

            services.AddHealthChecks();

            services.AddHealthChecksUI();

            services.AddAuthentication()
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority            = "auth";
                options.RequireHttpsMetadata = true;
            });
        }
예제 #14
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            // Supports ASP.Net Core DI abstractions
            services.AddLogging();
            services.AddControllers();

            // Also exposes Lamar specific registrations
            // and functionality
            services.Scan(s =>
            {
                s.TheCallingAssembly();
                s.Assembly(typeof(AppDbContext).Assembly);
                s.WithDefaultConventions();
            });

            services.AddDbContext <AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SQLConnection")));

            services.AddCors();

            // This adds Lamar's validation to the
            // Oakton.AspNetCore environment check support
            services.CheckLamarConfiguration();
        }
예제 #15
0
파일: Startup.cs 프로젝트: SOJe92/MyHome
        public void ConfigureContainer(ServiceRegistry services)
        {
            // Add your ASP.Net Core services as usual
            services.AddMvc();
            services.AddLogging();
            services.AddControllersWithViews();
            // In production, the React files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/build";
            });

            // Also exposes Lamar specific registrations
            // and functionality
            services.Scan(scanner =>
            {
                // Here you can add various assembly scans
                // to ensure Lamar finds all your classes
                // and registers your project conventions.
                scanner.TheCallingAssembly();
                scanner.WithDefaultConventions();
                scanner.SingleImplementationsOfInterface();

                // Add all implementations of an interface
                scanner.AssemblyContainingType <IUserService>();
                scanner.AssemblyContainingType <IMenuService>();
            });

            // You can create your own registries like with StructurMap
            // and use expressions to configure types
            //services.For<IAbstraction>().Use(new ConcreteImplementation());

            // Power up your architechture with the decorator pattern
            //services
            //    .For(typeof(ICommandHandler<>))
            //    .DecorateAllWith(typeof(ValidationCommandHandlerDecorator));
        }
예제 #16
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddMiniProfiler(opt =>
            {
                // opt.RouteBasePath = "/profiler";
                opt.ShouldProfile             = _ => true;
                opt.ShowControls              = true;
                opt.StackMaxLength            = short.MaxValue;
                opt.PopupStartHidden          = false;
                opt.PopupShowTrivial          = true;
                opt.PopupShowTimeWithChildren = true;
            });

            services.AddHttpsRedirection(options => options.HttpsPort = 443);

            // Add framework services
            // Add functionality to inject IOptions<T>
            services.AddOptions();

            services.AddResponseCompression();

            services.AddLogging();

            services.AddRouting(options => options.LowercaseUrls = true);

            services.AddDistributedMemoryCache();

            services.AddSession(options =>
            {
                // Set a short timeout for easy testing.
                options.IdleTimeout         = TimeSpan.FromMinutes(60);
                options.Cookie.HttpOnly     = true;
                options.Cookie.Name         = ApiConstants.AuthenticationSessionCookieName;
                options.Cookie.SecurePolicy = CookieSecurePolicy.None;
            });

            // Make sure a JS engine is registered, or you will get an error!
            services.AddJsEngineSwitcher(options => options.DefaultEngineName = ChakraCoreJsEngine.EngineName)
            .AddChakraCore();

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo {
                    Title = ApplicationName, Version = "v1"
                });

                // Set the comments path for the Swagger JSON and UI.
                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);

                if (File.Exists(xmlPath))
                {
                    c.IncludeXmlComments(xmlPath);
                }

                c.AddSecurityDefinition("Bearer", // Name the security scheme
                                        new OpenApiSecurityScheme
                {
                    Description = "JWT Authorization header using the Bearer scheme.",
                    Type        = SecuritySchemeType.Http,
                    Scheme      = "bearer"
                });
            });

            services.AddMvc(x =>
            {
                // Not need to have https
                x.RequireHttpsPermanent = false;

                // Allow anonymous for localhost
                if (_env.IsDevelopment())
                {
                    x.Filters.Add <AllowAnonymousFilter>();
                }

                // Exception filter attribute
                x.Filters.Add <ExceptionFilterAttribute>();
            })
            .AddViewOptions(x =>
            {
                x.HtmlHelperOptions.ClientValidationEnabled = true;
            })
            .AddNewtonsoftJson(x =>
            {
                x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                x.SerializerSettings.Converters.Add(new StringEnumConverter {
                    NamingStrategy = new CamelCaseNamingStrategy()
                });
                x.SerializerSettings.ContractResolver =
                    new CamelCasePropertyNamesContractResolver();

                x.SerializerSettings.ContractResolver = new IgnoreUserContractResolver();
            })
            .AddRazorPagesOptions(x => x.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute()));

            services.AddWebMarkupMin(opt =>
            {
                opt.AllowMinificationInDevelopmentEnvironment = true;
                opt.AllowCompressionInDevelopmentEnvironment  = true;
            })
            .AddHtmlMinification()
            .AddHttpCompression();

            // If using Kestrel:
            services.Configure <KestrelServerOptions>(options =>
            {
                options.AllowSynchronousIO = true;
            });

            // If using IIS:
            services.Configure <IISServerOptions>(options =>
            {
                options.AllowSynchronousIO = true;
            });

            services.AddDbContext <EntityDbContext>(opt =>
            {
                if (_env.IsDevelopment())
                {
                    opt.UseSqlite(_configuration.GetValue <string>("ConnectionStrings:Sqlite"));
                }
                else
                {
                    var postgresConnectionString =
                        ConnectionStringUrlToPgResource(_configuration.GetValue <string>("DATABASE_URL")
                                                        ?? throw new Exception("DATABASE_URL is null"));
                    opt.UseNpgsql(postgresConnectionString);
                }
            }, ServiceLifetime.Transient);

            services.AddIdentity <User, IdentityRole <int> >(x => x.User.RequireUniqueEmail = true)
            .AddEntityFrameworkStores <EntityDbContext>()
            .AddRoles <IdentityRole <int> >()
            .AddDefaultTokenProviders();

            // L2 EF cache
            if (_env.IsDevelopment())
            {
                services.AddEFSecondLevelCache(options =>
                                               options.UseEasyCachingCoreProvider("memory").DisableLogging(true)
                                               );

                services.AddEasyCaching(options => options.UseInMemory("memory"));
            }
            else
            {
                services.AddEFSecondLevelCache(options =>
                                               options.UseEasyCachingCoreProvider("redis").DisableLogging(true));

                services.AddEasyCaching(options =>
                {
                    var(_, dictionary) = UrlUtility.UrlToResource(_configuration.GetValue <string>("REDISTOGO_URL"));

                    // use memory cache with your own configuration
                    options.UseRedis(x =>
                    {
                        x.DBConfig.Endpoints.Add(new ServerEndPoint(dictionary["Host"], int.Parse(dictionary["Port"])));
                        x.DBConfig.Username           = dictionary["Username"];
                        x.DBConfig.Password           = dictionary["Password"];
                        x.DBConfig.AbortOnConnectFail = false;
                    });
                });
            }

            services.AddEfRepository <EntityDbContext>(x =>
            {
                x.Profiles(Assembly.Load("Dal"), Assembly.Load("Models"));
            });

            services.AddAutoMapper(Assembly.Load("Models"));

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(x =>
            {
                x.Cookie.MaxAge = TimeSpan.FromMinutes(60);
                x.LoginPath     = new PathString("/Login/");
                x.LogoutPath    = new PathString("/Logout/");
            });

            services.For <GlobalConfigs>().Use(new GlobalConfigs()).Singleton();

            // Initialize the email jet client
            services.For <IMailjetClient>().Use(new MailjetClient(
                                                    _configuration.GetValue <string>("MAIL_JET_KEY"),
                                                    _configuration.GetValue <string>("MAIL_JET_SECRET"))
                                                ).Singleton();

            // If environment is localhost then use mock email service
            if (_env.IsDevelopment())
            {
                services.For <IS3Service>().Use(new S3Service()).Singleton();
                services.For <IEmailServiceApi>().Use(new EmailServiceApi()).Singleton();
            }
            else
            {
                var(accessKeyId, secretAccessKey, url) = (
                    _configuration.GetRequiredValue <string>("CLOUDCUBE_ACCESS_KEY_ID"),
                    _configuration.GetRequiredValue <string>("CLOUDCUBE_SECRET_ACCESS_KEY"),
                    _configuration.GetRequiredValue <string>("CLOUDCUBE_URL")
                    );

                var          prefix     = new Uri(url).Segments.GetValue(1)?.ToString();
                const string bucketName = "cloud-cube";

                // Generally bad practice
                var credentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);

                // Create S3 client
                services.For <IAmazonS3>().Use(new AmazonS3Client(credentials, RegionEndpoint.USEast1));
                services.For <S3ServiceConfig>().Use(new S3ServiceConfig(bucketName, prefix));

                services.For <IS3Service>().Use(ctx => new S3Service(
                                                    ctx.GetInstance <ILogger <S3Service> >(),
                                                    ctx.GetInstance <IAmazonS3>(),
                                                    ctx.GetInstance <S3ServiceConfig>()
                                                    ));

                services.For <MailGunConfig>().Use(new MailGunConfig
                {
                    ApiKey = _configuration.GetRequiredValue <string>("MAILGUN_API_KEY"),
                    Domain = _configuration.GetRequiredValue <string>("MAILGUN_DOMAIN")
                });
            }

            // Register stuff in container, using the StructureMap APIs...
            services.Scan(_ =>
            {
                _.AssemblyContainingType(typeof(Startup));
                _.Assembly("Api");
                _.Assembly("Logic");
                _.Assembly("Dal");
                _.WithDefaultConventions();
            });
        }
예제 #17
0
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddLogging(config =>
            {
                config.ClearProviders();

                config.AddConfiguration(Configuration.GetSection("Logging"));
                config.AddApplicationInsights();
            });

            //Response Compression - https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-5.0
            services.AddResponseCompression();

            services.AddCors(options =>
            {
                options.AddPolicy("SpecificOrigins",
                                  builder =>
                {
                    builder.WithOrigins("https://tmireact.azurewebsites.net", "https://theminiindex.com", "https://wwww.theminiindex.com", "http://localhost:3000")
                    .AllowAnyHeader()
                    .AllowAnyMethod();
                });
            });

            services.Configure <CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded    = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddSwaggerGen();

            services.AddDefaultIdentity <IdentityUser>()
            .AddRoles <IdentityRole>()
            .AddEntityFrameworkStores <MiniIndexContext>();

            services.AddHangfire(configuration => configuration
                                 .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                                 .UseSimpleAssemblyNameTypeSerializer()
                                 .UseRecommendedSerializerSettings()
                                 .UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
            {
                CommandBatchMaxTimeout       = TimeSpan.FromMinutes(5),
                SlidingInvisibilityTimeout   = TimeSpan.FromMinutes(5),
                QueuePollInterval            = TimeSpan.Zero,
                UseRecommendedIsolationLevel = true,
                DisableGlobalLocks           = true
            }));
            services.AddHangfireServer();

            services
            .AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
            .AddRazorOptions(ConfigureRazor);

            services.AddDbContext <MiniIndexContext>(ConfigureEntityFramework);

            string facebookAppId     = Configuration["Authentication:Facebook:AppId"];
            string facebookAppSecret = Configuration["Authentication:Facebook:AppSecret"];

            if (facebookAppId != null && facebookAppSecret != null)
            {
                services.AddAuthentication()
                .AddFacebook(facebookOptions =>
                {
                    facebookOptions.AppId     = facebookAppId;
                    facebookOptions.AppSecret = facebookAppSecret;
                });
            }

            services.AddTransient <IEmailSender, EmailSender>();
            services.Configure <AuthMessageSenderOptions>(Configuration);
            services.AddApplicationInsightsTelemetry();
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
            services.AddSingleton <ITelemetryInitializer, TelemetryEnrichment>();
            services.AddApplicationInsightsTelemetryProcessor <AppInsightsFilter>();
            services.Configure <AzureStorageConfig>(Configuration.GetSection("AzureStorageConfig"));

            services.IncludeRegistry <CoreServices>();
            services.IncludeRegistry <WebAppServices>();
        }
예제 #18
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureContainer(ServiceRegistry services)
        {
            services.AddMiniProfiler(opt =>
            {
                // opt.RouteBasePath = "/profiler";
                opt.ShouldProfile             = _ => true;
                opt.ShowControls              = true;
                opt.StackMaxLength            = short.MaxValue;
                opt.PopupStartHidden          = false;
                opt.PopupShowTrivial          = true;
                opt.PopupShowTimeWithChildren = true;
            });

            services.AddHttpsRedirection(options => options.HttpsPort = 443);

            // If environment is localhost, then enable CORS policy, otherwise no cross-origin access
            services.AddCors(options => options.AddPolicy("CorsPolicy", builder => builder
                                                          .WithOrigins(_configuration.GetSection("TrustedSpaUrls").Get <string[]>())
                                                          .AllowAnyHeader()
                                                          .AllowAnyMethod()
                                                          .AllowCredentials()));

            // Add framework services
            // Add functionality to inject IOptions<T>
            services.AddOptions();

            services.AddResponseCompression();

            services.Configure <JwtSettings>(_configuration.GetSection("JwtSettings"));

            services.AddLogging();

            services.AddRouting(options => options.LowercaseUrls = true);

            if (_env.IsDevelopment())
            {
                services.AddDistributedMemoryCache();
            }
            else
            {
                var redisConnectionString =
                    ConnectionStringUrlToRedisResource(_configuration.GetValue <string>("REDISTOGO_URL"));

                services.AddStackExchangeRedisCache(c => c.Configuration = redisConnectionString);
            }

            services.AddSession(options =>
            {
                // Set a short timeout for easy testing.
                options.IdleTimeout         = TimeSpan.FromMinutes(60);
                options.Cookie.HttpOnly     = true;
                options.Cookie.Name         = ApiConstants.AuthenticationSessionCookieName;
                options.Cookie.SecurePolicy = CookieSecurePolicy.None;
            });

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "Stream-Ripper-API", Version = "v1"
                });

                // Set the comments path for the Swagger JSON and UI.
                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);

                if (File.Exists(xmlPath))
                {
                    c.IncludeXmlComments(xmlPath);
                }

                c.AddSecurityDefinition("Bearer",
                                        new OpenApiSecurityScheme
                {
                    Description = "JWT Authorization header using the Bearer scheme.",
                    Type        = SecuritySchemeType.Http,
                    Scheme      = "bearer"
                });
            });

            services.AddMvc(x =>
            {
                x.ModelValidatorProviders.Clear();

                // Not need to have https
                x.RequireHttpsPermanent = false;

                // Allow anonymous for localhost
                if (_env.IsDevelopment())
                {
                    x.Filters.Add <AllowAnonymousFilter>();
                }

                // Exception filter attribute
                x.Filters.Add <ExceptionFilterAttribute>();
            }).AddNewtonsoftJson(x =>
            {
                x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            })
            .AddRazorPagesOptions(x => x.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute()));

            services.AddDbContext <EntityDbContext>(opt =>
            {
                if (_env.IsDevelopment())
                {
                    opt.UseSqlite(_configuration.GetValue <string>("ConnectionStrings:Sqlite"));
                }
                else
                {
                    var postgresConnectionString =
                        ConnectionStringUrlToPgResource(_configuration.GetValue <string>("DATABASE_URL")
                                                        ?? throw new Exception("DATABASE_URL is null"));
                    opt.UseNpgsql(postgresConnectionString);
                }
            });

            services.AddIdentity <User, IdentityRole <int> >(x => x.User.RequireUniqueEmail = true)
            .AddEntityFrameworkStores <EntityDbContext>()
            .AddRoles <IdentityRole <int> >()
            .AddDefaultTokenProviders();

            // L2 EF cache
            if (_env.IsDevelopment())
            {
                services.AddEFSecondLevelCache(options =>
                                               options.UseEasyCachingCoreProvider("memory").DisableLogging(true)
                                               );

                services.AddEasyCaching(options => options.UseInMemory("memory"));
            }
            else
            {
                services.AddEFSecondLevelCache(options =>
                                               options.UseEasyCachingCoreProvider("redis").DisableLogging(true));

                services.AddEasyCaching(options =>
                {
                    var(_, dictionary) = UrlUtility.UrlToResource(_configuration.GetValue <string>("REDISTOGO_URL"));

                    // use memory cache with your own configuration
                    options.UseRedis(x =>
                    {
                        x.DBConfig.Endpoints.Add(
                            new EasyCaching.Core.Configurations.ServerEndPoint(dictionary["Host"],
                                                                               int.Parse(dictionary["Port"])));
                        x.DBConfig.Username           = dictionary["Username"];
                        x.DBConfig.Password           = dictionary["Password"];
                        x.DBConfig.AbortOnConnectFail = false;
                    });
                });
            }

            services.AddEfRepository <EntityDbContext>(x =>
            {
                x.Profiles(Assembly.Load("Dal"), Assembly.Load("Models"));
            });

            var jwtSetting = _configuration
                             .GetSection("JwtSettings")
                             .Get <JwtSettings>();

            if (_env.IsDevelopment() && string.IsNullOrEmpty(jwtSetting.Key))
            {
                jwtSetting.Key =
                    "DCk2T4guOWvu8WRklEEmKazH5gqUJQnyCYXfzFJQU84tY0iJFeUJc2yIQqkqJ4od8AQvyXdlOFP0Q0QGWzB84W4hWFptL8APynvt";

                IdentityModelEventSource.ShowPII = true;
            }

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(config =>
            {
                config.RequireHttpsMetadata = false;
                config.SaveToken            = true;

                config.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidIssuer      = jwtSetting.Issuer,
                    ValidAudience    = jwtSetting.Audience,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSetting.Key))
                };
            });

            services.For <JwtSettings>().Use(jwtSetting).Singleton();

            // If environment is localhost then use mock email service
            if (_env.IsDevelopment())
            {
                services.For <IS3Service>().Use(new S3Service()).Singleton();
            }
            else
            {
                var(accessKeyId, secretAccessKey, url) = (
                    _configuration.GetRequiredValue <string>("CLOUDCUBE_ACCESS_KEY_ID"),
                    _configuration.GetRequiredValue <string>("CLOUDCUBE_SECRET_ACCESS_KEY"),
                    _configuration.GetRequiredValue <string>("CLOUDCUBE_URL")
                    );

                var          prefix     = new Uri(url).Segments.GetValue(1)?.ToString();
                const string bucketName = "cloud-cube";

                // Generally bad practice
                var credentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);

                // Create S3 client
                services.For <IAmazonS3>().Use(new AmazonS3Client(credentials, RegionEndpoint.USEast1));
                services.For <S3ServiceConfig>().Use(new S3ServiceConfig(bucketName, prefix));

                services.For <IS3Service>().Use(ctx => new S3Service(
                                                    ctx.GetInstance <ILogger <S3Service> >(),
                                                    ctx.GetInstance <IAmazonS3>(),
                                                    ctx.GetInstance <S3ServiceConfig>()
                                                    ));
            }

            // Register stuff in container, using the StructureMap APIs...
            services.Scan(_ =>
            {
                _.AssemblyContainingType(typeof(Startup));
                _.Assembly("Api");
                _.Assembly("Logic");
                _.Assembly("Dal");
                _.WithDefaultConventions();
            });
        }
예제 #19
0
 public void ConfigureContainer(ServiceRegistry services)
 {
     services.AddMvc();
     services.AddLogging();
 }