You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
4.4 KiB

using CoreAgent.Infrastructure.Extensions;
using System.Reflection;
using Serilog;
namespace CoreAgent.API
{
public class Startup
{
public IConfiguration Configuration { get; }
public IHostEnvironment Environment { get; }
public Startup(IConfiguration configuration, IHostEnvironment environment)
{
Configuration = configuration;
Environment = environment;
}
public void ConfigureServices(IServiceCollection services)
{
// Add MediatR
services.AddMediatR(cfg => {
cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
cfg.RegisterServicesFromAssembly(typeof(Startup).Assembly);
cfg.RegisterServicesFromAssembly(Assembly.Load("CoreAgent.Application"));
});
// 添加基础设施服务
services.AddInfrastructure(Configuration);
// 添加控制器
services.AddControllers();
// 添加API文档
services.AddEndpointsApiExplorer();
services.AddSwaggerGen();
}
public void Configure(IApplicationBuilder app)
{
// 配置开发环境中间件
if (Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
Log.Debug("Swagger UI enabled in development environment");
}
// 使用基础设施中间件
app.UseInfrastructure(Configuration);
// 配置控制器路由
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
public static class StartupExtensions
{
public static WebApplicationBuilder AddConfigurations(this WebApplicationBuilder builder)
{
const string configurationsDirectory = "Configurations";
var env = builder.Environment;
// 基础配置
builder.Configuration
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
// 基础设施配置
builder.Configuration
.AddJsonFile($"{configurationsDirectory}/logger.json", optional: false, reloadOnChange: true)
.AddJsonFile($"{configurationsDirectory}/logger.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"{configurationsDirectory}/request-logging.json", optional: false, reloadOnChange: true)
.AddJsonFile($"{configurationsDirectory}/request-logging.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"{configurationsDirectory}/api-versioning.json", optional: false, reloadOnChange: true)
.AddJsonFile($"{configurationsDirectory}/api-versioning.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
return builder;
}
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration config)
{
return services
.AddLoggingServices(config)
.AddApiVersioningExtension(config)
.AddRequestLogging(config)
.AddAuthorization()
.AddCommandCustomService()
.AddSwaggerGen();
}
public static IApplicationBuilder UseInfrastructure(this IApplicationBuilder app, IConfiguration config)
{
return app
.UseHttpsRedirection()
.UseExceptionMiddleware()
.UseAuthorization()
.UseRequestLogging(config)
.UseApiVersioningExtension();
}
public static void ConfigureSwagger(this WebApplication app)
{
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
}
// 新增:创建Startup实例的扩展方法
public static Startup CreateStartup(this WebApplicationBuilder builder)
{
return new Startup(builder.Configuration, builder.Environment);
}
}
}