using System.Text.Json; using Microsoft.EntityFrameworkCore; using Serilog; using Hua.Todo.Application.Common; using Hua.Todo.Application.Models; using Hua.Todo.Application.Repositories; using Hua.Todo.HttpApi; using Hua.Todo.HttpApi.AspNetCore.CloudSync.Services; using Hua.Todo.HttpApi.AspNetCore.DynamicApi; using Hua.Todo.HttpApi.AspNetCore.DynamicApi.Swagger; using Hua.Todo.HttpApi.AspNetCore.Mcp; // 配置 Serilog 文件日志(开发环境统一到项目根目录 logs/) Log.Logger = LoggingConfiguration.Create( Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "..", "..", "logs"))).CreateLogger(); Log.Information("[Startup] Serilog 初始化完成"); var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog(); Log.Information("[Startup] WebApplication.CreateBuilder 完成"); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(options => { options.DocumentFilter(); }); Log.Information("[Startup] Swagger 注册完成"); builder.Services.AddApplicationServices("Data Source=Hua.Todo.db"); Log.Information("[Startup] AddApplicationServices 完成"); // 注册云同步服务端能力(认证 / RBAC / 二次认证 / 任务同步 / 安全策略) builder.Services.AddCloudSyncServer(); Log.Information("[Startup] AddCloudSyncServer 完成"); // 注册 MCP Server(依赖 ITaskService,须在 AddApplicationServices 之后调用) builder.Services.AddMcpServerServices(); Log.Information("[Startup] AddMcpServerServices 完成"); builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); Log.Information("[Startup] DI 注册全部完成"); var app = builder.Build(); Log.Information("[Startup] builder.Build() 完成"); // Apply database migrations using (var scope = app.Services.CreateScope()) { Log.Information("[Startup] 开始 EF Core Migrate..."); var dbContext = scope.ServiceProvider.GetRequiredService(); dbContext.Database.Migrate(); Log.Information("[Startup] EF Core Migrate 完成"); } if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseCors("AllowAll"); app.UseAuthentication(); app.UseAuthorization(); app.UseDynamicApi(); // 映射 MCP Server 端点(Streamable HTTP,路径 /mcp) app.MapMcpServer(); app.Run();