public void ConfigureServices(IServiceCollection services)
{
services.AddHangfire(
config => config.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings().UseSqlServerStorage(
this.configuration.GetConnectionString("DefaultConnection"),
new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true,
}).UseConsole());
if (this.env.IsProduction())
{
services.AddHangfireServer(options => options.WorkerCount = 2);
}
services.AddDbContext<ApplicationDbContext>(
options => options.UseSqlServer(this.configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<ApplicationUser>(IdentityOptionsProvider.GetIdentityOptions)
.AddRoles<ApplicationRole>().AddEntityFrameworkStores<ApplicationDbContext>();
services.Configure<CookiePolicyOptions>(
options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddControllersWithViews();
services.AddRazorPages();
services.AddSingleton(this.configuration);
// Data repositories
services.AddScoped(typeof(IDeletableEntityRepository<>), typeof(EfDeletableEntityRepository<>));
services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>));
services.AddScoped<IDbQueryRunner, DbQueryRunner>();
// Application services
services.AddTransient<IBlogUrlGenerator, BlogUrlGenerator>();
services.AddTransient<IEmailSender>(_ => new SendGridEmailSender(this.configuration["SendGrid:ApiKey"]));
services.AddTransient<ILatestVideosProvider, LatestVideosProvider>();
services.AddTransient<IYouTubeChannelVideosFetcher>(
s => new YouTubeChannelVideosFetcher(this.configuration["YouTube:ApiKey"]));
}