/
vladistoma
/
LazyLife
Обзор
Документация
Войти
/
vladistoma
/
LazyLife
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FileStorageGrpc/Program.cs
84 строки
3 KB
Vladislav Sidorkin
Добавил рабочий эндпоинт по сохранению файлов в S3 Garage через GRPC
01 авг 2026, 18:59
01 авг 2026, 18:59
21777f3
Код
Авторство
О чём код?
using Amazon.S3; using FileStorageGrpc.Services; using Lazylife.Application.Commands; using Lazylife.Domain.Interfaces; using Lazylife.Infrastructure.Persistence; using Lazylife.Infrastructure.Storage; using LiteBus.Commands; using LiteBus.Events; using LiteBus.Extensions.Microsoft.DependencyInjection; using LiteBus.Queries; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = WebApplication.CreateBuilder(args); builder.AddServiceDefaults(); builder.Services.AddGrpc(); // Явно извлекаем строку подключения, которую передал Aspire (имя совпадает с переменной из AppHost) var connectionString = builder.Configuration.GetConnectionString("files-db"); builder.Services.AddDbContext<FileStorageDbContext>(options => { // 1. Передаем строку подключения options.UseNpgsql(connectionString); options.UseSnakeCaseNamingConvention(); // 2. ОБЯЗАТЕЛЬНО для Native AOT: привязываем скомпилированную модель вручную //options.UseModel(FileStorageDbContextModel.Instance); }); // builder.Services.AddDbContext<FileStorageDbContext>(options => // { // options.UseNpgsql(builder.Configuration.GetConnectionString("PostgresDb")); // options.UseModel(FileStorageDbContextModel.Instance); // }); builder.Services.AddScoped<IFileMetadataRepository, FileMetadataRepository>(); // добавляем liteBus для работы с командами, событиями, запросами, обработчиками. builder.Services.AddLiteBus(liteBus => { var assembly = typeof(CreateUploadPresignedUrlCommand).Assembly; liteBus.AddCommandModule(module => module.RegisterFromAssembly(assembly)); liteBus.AddQueryModule(module => module.RegisterFromAssembly(assembly)); liteBus.AddEventModule(module => module.RegisterFromAssembly(assembly)); }); // 1. Достаем URL гаража из конфигурации (Aspire прокинет его через переменные окружения) // В Aspire переменная будет называться примерно так: services__garage__http__3972 var garageUrl = builder.Configuration["services:garage:http:3972"] ?? builder.Configuration["S3_SERVICE_URL"]; // Запасной вариант // 2. Регистрируем IAmazonS3, чтобы DI знал, как его создать builder.Services.AddSingleton<IAmazonS3>(sp => { var config = new AmazonS3Config { ServiceURL = garageUrl, ForcePathStyle = true // КРИТИЧНО для Garage! }; // Для Garage ключи могут быть любыми строками, если не включена строгая проверка return new AmazonS3Client("garage_key", "garage_secret", config); }); // Подключаем S3 гаражик builder.Services.AddSingleton<IS3Service, GarageS3>(); var app = builder.Build(); app.MapDefaultEndpoints(); app.MapGrpcService<FileGrpcService>(); // Configure the HTTP request pipeline. //app.MapGrpcService<GreeterService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); app.Run();