using System; using System.Linq; using System.Text.Encodings.Web; using System.Text.Unicode; using MediatR; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.WebEncoders; using Microsoft.OpenApi.Models; using SimplCommerce.Infrastructure; using SimplCommerce.Infrastructure.Data; using SimplCommerce.Infrastructure.Modules; using SimplCommerce.Infrastructure.Web; using SimplCommerce.Module.Core.Data; using SimplCommerce.Module.Core.Extensions; using SimplCommerce.Module.Localization.Extensions; using SimplCommerce.Module.Localization.TagHelpers; using SimplCommerce.WebHost.Extensions; var builder = WebApplication.CreateBuilder(args); ConfigureService(); var app = builder.Build(); Configure(); app.Run(); void ConfigureService() { var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Configuration.AddEntityFrameworkConfig(options => options.UseSqlServer(connectionString)); GlobalConfiguration.WebRootPath = builder.Environment.WebRootPath; GlobalConfiguration.ContentRootPath = builder.Environment.ContentRootPath; builder.Services.AddModules(); builder.Services.AddCustomizedDataStore(builder.Configuration); builder.Services.AddCustomizedIdentity(builder.Configuration); builder.Services.AddHttpClient(); builder.Services.AddTransient(typeof(IRepository<>), typeof(Repository<>)); builder.Services.AddTransient(typeof(IRepositoryWithTypedId<,>), typeof(RepositoryWithTypedId<,>)); builder.Services.AddScoped(); builder.Services.AddCustomizedLocalization(); builder.Services.AddCustomizedMvc(GlobalConfiguration.Modules); builder.Services.Configure( options => { options.ViewLocationExpanders.Add(new ThemeableViewLocationExpander()); }); builder.Services.Configure(options => { options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All); }); builder.Services.AddScoped(); builder.Services.AddTransient(); builder.Services.AddAntiforgery(options => options.HeaderName = "X-XSRF-Token"); builder.Services.AddCloudscribePagination(); foreach (var module in GlobalConfiguration.Modules) { var moduleInitializerType = module.Assembly.GetTypes() .FirstOrDefault(t => typeof(IModuleInitializer).IsAssignableFrom(t)); if ((moduleInitializerType != null) && (moduleInitializerType != typeof(IModuleInitializer))) { var moduleInitializer = (IModuleInitializer)Activator.CreateInstance(moduleInitializerType); builder.Services.AddSingleton(typeof(IModuleInitializer), moduleInitializer); moduleInitializer.ConfigureServices(builder.Services); } } builder.Services.AddScoped(p => p.GetService); builder.Services.AddScoped(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "SimplCommerce API", Version = "v1" }); }); } void Configure() { if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseMigrationsEndPoint(); } else { app.UseWhen( context => !context.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase), a => a.UseExceptionHandler("/Home/Error") ); app.UseHsts(); } app.UseWhen( context => !context.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase), a => a.UseStatusCodePagesWithReExecute("/Home/ErrorWithCode/{0}") ); app.UseHttpsRedirection(); app.UseCustomizedStaticFiles(builder.Environment); app.UseRouting(); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "SimplCommerce API V1"); }); app.UseCookiePolicy(); app.UseCustomizedIdentity(); app.UseCustomizedRequestLocalization(); app.UseEndpoints(endpoints => { endpoints.MapDynamicControllerRoute("/{**slug}"); endpoints.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); var moduleInitializers = app.Services.GetServices(); foreach (var moduleInitializer in moduleInitializers) { moduleInitializer.Configure(app, builder.Environment); } }