using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; using DysonNetwork.Shared.Cache; using DysonNetwork.Shared.GeoIp; using DysonNetwork.Zone.Publication; using NodaTime; using NodaTime.Serialization.SystemTextJson; // Add this using statement namespace DysonNetwork.Zone.Startup; public static class ServiceCollectionExtensions { public static IServiceCollection AddAppServices(this IServiceCollection services) { services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddDbContext(); services.AddSingleton(SystemClock.Instance); services.AddHttpContextAccessor(); services.AddSingleton(); services.AddSingleton(); services.AddHttpClient(); services .AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals; options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower; options.JsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); }); services.AddRazorPages(); services.AddGrpc(options => { options.EnableDetailedErrors = true; }); services.AddGrpcReflection(); services.Configure(options => { var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("zh-Hans") }; options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); services.AddHostedService(); return services; } public static IServiceCollection AddAppAuthentication(this IServiceCollection services) { services.AddAuthorization(); return services; } public static IServiceCollection AddAppFlushHandlers(this IServiceCollection services) { services.AddSingleton(); return services; } public static IServiceCollection AddAppBusinessServices( this IServiceCollection services, IConfiguration configuration ) { services.Configure(configuration.GetSection("GeoIP")); services.AddScoped(); services.AddScoped(); services.AddScoped(); return services; } }