using WIDESEAWCS_S7Simulator.Core.Interfaces; using WIDESEAWCS_S7Simulator.Core.Manager; using WIDESEAWCS_S7Simulator.Core.Persistence; using WIDESEAWCS_S7Simulator.Core.Memory; using WIDESEAWCS_S7Simulator.Core.Entities; using System.Text.Json.Serialization; using WIDESEAWCS_S7Simulator.Application.Protocol; using WIDESEAWCS_S7Simulator.Server.Services; var builder = WebApplication.CreateBuilder(args); // Add services to the container. // 添加 CORS 支持(允许前后端分离) builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.WithOrigins("http://localhost:3000", "http://localhost:5173", "http://localhost:5174", "http://localhost:3001") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); }); }); builder.Services.AddControllers(options => { // 禁用隐式 [Required] 验证 options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true; }) .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // Register core services builder.Services.AddSingleton(); // Get content root path for data directory var contentRoot = builder.Environment.ContentRootPath; var dataPath = Path.Combine(contentRoot, "Data"); builder.Services.AddSingleton(sp => new FilePersistenceService(dataPath)); builder.Services.AddSingleton(sp => new FileProtocolTemplateService(dataPath)); builder.Services.AddSingleton(); builder.Services.Configure(builder.Configuration.GetSection("ProtocolMonitoring")); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddHostedService(); builder.Services.AddSingleton(sp => { var config = new MemoryRegionConfig(); return new MemoryStore(config); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseCors("AllowAll"); // 启用 CORS app.UseAuthorization(); app.MapControllers(); // 启动时加载已保存的实例(不自动启动) var instanceManager = app.Services.GetRequiredService(); _ = Task.Run(async () => { try { await instanceManager.LoadSavedInstancesAsync(autoStart: false); Console.WriteLine($"Loaded {instanceManager.GetAllInstances().Count()} saved instances."); } catch (Exception ex) { Console.WriteLine($"Error loading saved instances: {ex.Message}"); } }); app.Run();