using Microsoft.EntityFrameworkCore; using ServerManagement.Components; using ServerManagement.Data; using ServerManagement.StateStore; var builder = WebApplication.CreateBuilder(args); // Add services to the container. // Do not use this, it can cause non-thread-safe complications, due to its Scoped lifetime. // builder.Services.AddDbContext(); // Instead, use factory: builder.Services.AddDbContextFactory( options => { options.UseSqlite(builder.Configuration.GetConnectionString("ServerManagement")); } ); builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); // Provides server interactivity. // Singleton - A single instance is created and shared troughout the application's lifetime. // Scoped - A new instance is created for each request. // Transient - A new instance is created every time it is needed. // See: https://www.youtube.com/watch?v=V-8HlozCTOU builder.Services.AddTransient(); // Scoped lifespan is the same as the SignalR lifespan. // Everything stored in the SignalR channel will be lost if that connection is broken. // This means that the data in there, can only be used for the current user. // For a WebAssembly, you want to use AddSingleton, so that everything is locally downloaded in the browser. builder.Services.AddScoped(); builder.Services.AddScoped(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error", createScopeForErrors: true); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAntiforgery(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); // Provides server interactivity. app.Run();