116 lines
4.2 KiB
C#
116 lines
4.2 KiB
C#
using AssetManager.Data;
|
||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||
using Microsoft.IdentityModel.Tokens;
|
||
using Microsoft.OpenApi.Models;
|
||
using System.Text;
|
||
|
||
var builder = WebApplication.CreateBuilder(args);
|
||
|
||
builder.Services.AddControllers();
|
||
builder.Services.AddEndpointsApiExplorer();
|
||
builder.Services.AddSwaggerGen(options =>
|
||
{
|
||
options.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
|
||
{
|
||
Name = "Authorization",
|
||
Type = Microsoft.OpenApi.Models.SecuritySchemeType.Http,
|
||
Scheme = "bearer",
|
||
BearerFormat = "JWT",
|
||
In = Microsoft.OpenApi.Models.ParameterLocation.Header,
|
||
Description = "Enter 'Bearer' [space] and then your token in the text input below."
|
||
});
|
||
options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
|
||
{
|
||
{
|
||
new Microsoft.OpenApi.Models.OpenApiSecurityScheme
|
||
{
|
||
Reference = new Microsoft.OpenApi.Models.OpenApiReference
|
||
{
|
||
Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme,
|
||
Id = "Bearer"
|
||
}
|
||
},
|
||
new string[] {}
|
||
}
|
||
});
|
||
});
|
||
|
||
builder.Services.AddCors(options =>
|
||
{
|
||
options.AddPolicy("AllowAll",
|
||
builder =>
|
||
{
|
||
builder.AllowAnyOrigin()
|
||
.AllowAnyMethod()
|
||
.AllowAnyHeader();
|
||
});
|
||
});
|
||
|
||
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
||
.AddJwtBearer(options =>
|
||
{
|
||
options.TokenValidationParameters = new TokenValidationParameters
|
||
{
|
||
ValidateIssuer = true,
|
||
ValidateAudience = true,
|
||
ValidateLifetime = true,
|
||
ValidateIssuerSigningKey = true,
|
||
ValidIssuer = "AssetManager",
|
||
ValidAudience = "AssetManager",
|
||
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-strong-secret-key-here-2026"))
|
||
};
|
||
});
|
||
|
||
builder.Services.AddDatabase();
|
||
|
||
builder.Services.AddHttpClient();
|
||
builder.Services.AddScoped<AssetManager.Services.Services.WechatService>();
|
||
builder.Services.AddScoped<AssetManager.Services.Services.JwtService>();
|
||
builder.Services.AddScoped<AssetManager.Services.IPortfolioService, AssetManager.Services.PortfolioService>();
|
||
builder.Services.AddScoped<AssetManager.Services.IStrategyService, AssetManager.Services.StrategyService>();
|
||
builder.Services.AddScoped<AssetManager.Services.ITickerService, AssetManager.Services.TickerService>();
|
||
|
||
// 市场数据服务:开发环境用 Mock,生产环境用 Alpaca
|
||
if (builder.Environment.IsDevelopment())
|
||
{
|
||
builder.Services.AddScoped<AssetManager.Infrastructure.Services.IMarketDataService, AssetManager.Infrastructure.Services.MockMarketDataService>();
|
||
}
|
||
else
|
||
{
|
||
builder.Services.AddScoped<AssetManager.Infrastructure.Services.IMarketDataService, AssetManager.Infrastructure.Services.MarketDataService>();
|
||
}
|
||
|
||
// 汇率服务:预留接口,目前用 Mock 实现
|
||
builder.Services.AddScoped<AssetManager.Infrastructure.Services.IExchangeRateService, AssetManager.Infrastructure.Services.MockExchangeRateService>();
|
||
|
||
// 策略引擎
|
||
builder.Services.AddScoped<AssetManager.Infrastructure.StrategyEngine.IStrategyEngine, AssetManager.Infrastructure.StrategyEngine.StrategyEngine>();
|
||
|
||
// 策略计算器
|
||
builder.Services.AddScoped<AssetManager.Infrastructure.StrategyEngine.IStrategyCalculator, AssetManager.Infrastructure.StrategyEngine.Calculators.ChandelierExitCalculator>();
|
||
builder.Services.AddScoped<AssetManager.Infrastructure.StrategyEngine.IStrategyCalculator, AssetManager.Infrastructure.StrategyEngine.Calculators.MaTrendCalculator>();
|
||
builder.Services.AddScoped<AssetManager.Infrastructure.StrategyEngine.IStrategyCalculator, AssetManager.Infrastructure.StrategyEngine.Calculators.RiskParityCalculator>();
|
||
|
||
builder.Logging.ClearProviders();
|
||
builder.Logging.AddConsole();
|
||
builder.Logging.AddDebug();
|
||
|
||
var app = builder.Build();
|
||
|
||
// 初始化数据库
|
||
app.Services.InitializeDatabase();
|
||
|
||
if (app.Environment.IsDevelopment())
|
||
{
|
||
app.UseSwagger();
|
||
app.UseSwaggerUI();
|
||
}
|
||
|
||
app.UseHttpsRedirection();
|
||
app.UseCors("AllowAll");
|
||
app.UseAuthentication();
|
||
app.UseAuthorization();
|
||
app.MapControllers();
|
||
|
||
app.Run();
|