Beispiel #1
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure <JwtAuthentication>(Configuration.GetSection("JwtAuthentication"));
            services.AddControllersWithViews()
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.Formatting       = Formatting.Indented;
                options.SerializerSettings.TypeNameHandling = TypeNameHandling.None;
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                options.SerializerSettings.Converters.Add(new StringEnumConverter());
                options.SerializerSettings.TypeNameHandling = TypeNameHandling.None;
            });

            services.AddAntiforgery(options =>
            {
                options.HeaderName          = "X-XSRF-Token";
                options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
            });

            services.AddSingleton <IPostConfigureOptions <JwtBearerOptions>, ConfigureJwtBearerOptions>();
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer();

            services.AddAuthorization(options =>
            {
                options.AddPolicy("Admins", policy => policy.RequireRole(RoleType.Admin.ToString()));
                options.AddPolicy("Contributers", policy => policy.RequireRole(RoleType.Contributer.ToString(), RoleType.Admin.ToString()));
                options.AddPolicy("Readers", policy => policy.RequireRole(RoleType.Reader.ToString(), RoleType.Contributer.ToString(), RoleType.Admin.ToString()));
            });

            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });

            services.AddCors(options =>
            {
                options.AddPolicy("AllowAllOrigins",
                                  builder =>
                {
                    builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                });
            });

            services.AddSignalR();

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "HomePhotos API", Version = "v1"
                });
                c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "SCS.HomePhotos.Web.xml"));
                c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "SCS.HomePhotos.Model.xml"));
                c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "SCS.HomePhotos.Service.xml"));
                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    In          = ParameterLocation.Header,
                    Description = "Please insert JWT with Bearer into field; for example: Bearer [token here]",
                    Name        = "Authorization",
                    Type        = SecuritySchemeType.ApiKey
                });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id   = "Bearer"
                            }
                        },
                        new string[] { }
                    }
                });
            });

            // config
            var staticConfig  = StaticConfig.Build(Configuration);
            var configData    = new ConfigData(staticConfig);
            var dynamicConfig = new DynamicConfig();

            services.AddSingleton <IStaticConfig>(staticConfig);
            services.AddSingleton <IConfigData>(configData);
            services.AddSingleton <IDynamicConfig>(dynamicConfig);
            var configService = new ConfigService(configData, dynamicConfig, staticConfig);

            SetDynamicConfig(configService).Wait();
            services.AddSingleton <IConfigService>(configService);

            // background tasks
            services.AddHostedService <QueuedHostedService>();
            services.AddHostedService <TimedIndexHostedService>();
            services.AddSingleton <IBackgroundTaskQueue, BackgroundTaskQueue>();

            // data objects
            services.AddScoped <IPhotoData, PhotoData>();
            services.AddScoped <ITagData, TagData>();
            services.AddScoped <IUserData, UserData>();
            services.AddScoped <IUserTokenData, UserTokenData>();
            services.AddScoped <ILogData, LogData>();

            // services
            services.AddScoped <IFileSystemService, FileSystemService>();
            services.AddScoped <IImageTransformer, ImageTransformer>();
            services.AddScoped <IImageService, ImageService>();
            services.AddScoped <IPhotoService, PhotoService>();
            services.AddScoped <IFileUploadService, FileUploadService>();
            services.AddScoped <IAccountService, AccountService>();
            services.AddScoped <ISecurityService, SecurityService>();
            services.AddSingleton <IAdminLogService>(new AdminLogService(new LogData(staticConfig), staticConfig));
            services.AddSingleton <IIndexEvents, IndexEvents>();
            services.AddSingleton <IQueueEvents, QueueEvents>();
            services.AddSingleton <IClientMessageSender, ClientMessageSender>();
            services.AddSingleton <IUploadTracker, UploadTracker>();
            services.AddSingleton <IImageMetadataService, ImageMetadataService>();
        }