Организация регистраций: extension-методы, модули
↑ 3.2 Dependency Injection · ← Предыдущая
Зачем это на собесе
Про поддерживаемость: как не превратить
Program.csв 500 строк регистраций.
Объяснение
Каждый модуль (слой, фича, библиотека) предоставляет extension-метод на IServiceCollection, а Program.cs только вызывает их.
public static class OrdersModule
{
public static IServiceCollection AddOrders(this IServiceCollection services, IConfiguration cfg)
{
services.AddScoped<IOrderService, OrderService>();
services.AddScoped<IOrderRepository, OrderRepository>();
services.AddOptions<OrdersOptions>().Bind(cfg.GetSection("Orders")).ValidateOnStart();
return services;
}
public static IEndpointRouteBuilder MapOrders(this IEndpointRouteBuilder app)
{
var g = app.MapGroup("/orders");
g.MapGet("{id:guid}", (Guid id, IOrderService s) => s.GetAsync(id));
return app;
}
}
// Program.cs
builder.Services.AddOrders(builder.Configuration).AddPayments(builder.Configuration);
app.MapOrders();| Подход | Плюсы | Минусы |
|---|---|---|
Extension-методы AddXxx | просто, стандарт платформы | нужно вызывать вручную |
| Сканирование сборок (Scrutor, конвенции) | меньше кода | неявно, сложно отлаживать |
Модули с интерфейсом IModule | единообразие | лишний уровень абстракции |
Соглашение: AddXxx — регистрации, UseXxx — middleware, MapXxx — endpoints.
Нюансы и подводные камни
- Сканирование всех классов по суффиксу «Service» регистрирует лишнее.
- Порядок регистрации влияет на перезапись сервисов.
- Модуль не должен читать
IConfigurationнапрямую при каждом вызове; передавайте секцию или Options. - Для тестов оставляйте возможность заменить сервисы через
ConfigureTestServices.
Практика
- Разнесите регистрации проекта по модулям
AddXxx. - Добавьте
MapGroupс общим префиксом и авторизацией. - Напишите тест, проверяющий, что все зависимости разрешаются (
ValidateOnBuild).
Вопросы с ответами
Как организовать регистрации в большом проекте?
Extension-методами по модулям и слоям;
Program.csостаётся тонким.
Что удобнее: ручные регистрации или сканирование?
Ручные явнее и безопаснее, сканирование удобно для однотипных обработчиков (MediatR, валидаторы).