Files
2025-07-20 03:41:39 -04:00

72 lines
2.2 KiB
C#

using Microsoft.EntityFrameworkCore;
using SqrtSpace.SpaceTime.AspNetCore;
using SqrtSpace.SpaceTime.Core;
using SqrtSpace.SpaceTime.EntityFramework;
using SqrtSpace.SpaceTime.Linq;
using SampleWebApi.Data;
using SampleWebApi.Services;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new() {
Title = "SqrtSpace SpaceTime Sample API",
Version = "v1",
Description = "Demonstrates memory-efficient data processing using √n space-time tradeoffs"
});
});
// Configure SpaceTime services with memory-aware settings
builder.Services.AddSpaceTime(options =>
{
options.EnableCheckpointing = true;
options.CheckpointDirectory = Path.Combine(Path.GetTempPath(), "spacetime-sample");
options.CheckpointStrategy = CheckpointStrategy.SqrtN;
options.DefaultChunkSize = 1000;
options.StreamingBufferSize = 64 * 1024; // 64KB
options.ExternalStorageDirectory = Path.Combine(Path.GetTempPath(), "spacetime-external");
});
// Add Entity Framework with in-memory database for demo
builder.Services.AddDbContext<SampleDbContext>(options =>
{
options.UseInMemoryDatabase("SampleDb");
// SpaceTime optimizations are available via EF integration
});
// Add application services
builder.Services.AddScoped<IProductService, ProductService>();
builder.Services.AddScoped<IOrderAnalyticsService, OrderAnalyticsService>();
builder.Services.AddHostedService<DataGeneratorService>();
// Configure memory limits
builder.Services.Configure<SampleWebApi.Models.MemoryOptions>(builder.Configuration.GetSection("MemoryOptions"));
var app = builder.Build();
// Configure the HTTP request pipeline
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
// Enable SpaceTime middleware for automatic memory management
app.UseSpaceTime();
app.MapControllers();
// Ensure database is created and seeded
using (var scope = app.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<SampleDbContext>();
await DataSeeder.SeedAsync(context);
}
app.Run();