TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2075 1.98K
День 1708. #ЧтоНовенького
Использование Сервисов по Ключу в .NET 8
В DI-контейнер .NET 8 наконец-то добавили то, что уже много лет включено в другие контейнеры — использование сервиса по ключу, позволяющее нам внедрять несколько сервисов одного типа, но с разной реализацией. Ключ позволяет определить, какую реализацию использовать.

Допустим, у нас есть интерфейс
public interface IVehicle
{
int Wheels { get; }
}

И две реализации:
public class Car : IVehicle
{
public int NoOfWheels => 4;
}
public class Bike : IVehicle
{
public int NoOfWheels => 2;
}

До .NET 8 можно было добавлять несколько реализаций:
builder.Services.AddScoped<IVehicle, Car>();
builder.Services.AddScoped<IVehicle, Bike>();

Однако, при внедрении использовалась последняя зарегистрированная реализация. Если бы мы хотели получить другие реализации, приходилось внедрять IEnumerable<IVehicle> и выбирать правильную реализацию уже в клиенте. Подробнее тут.

В .NET 8 можно разделить несколько сервисов с помощью ключа. Для IServiceCollection были добавлены методы расширения AddKeyedSingleton, AddKeyedScoped и AddKeyedTransient. Например:
builder.Services.AddKeyedScoped<IVehicle, Car>("car");
builder.Services.AddKeyedScoped<IVehicle, Bike>("bike");

Теперь в минимальных API можно использовать атрибут FromKeyedServices:
app.MapGet("/api/carweels", (
[FromKeyedServices("car")] IVehicle v) =>
{
return Ok(new {
CarWheels = v.NoOfWheels
});
});

Ключ определяет, какую реализацию необходимо использовать.

Аналогично для контроллеров:
[ApiController]
public class VehicleApiController : Controller
{
[HttpGet("carweels")]
public IActionResult CarWheels(
[FromKeyedServices("car")] IVehicle v)
{
return Ok(new {
CarWheels = v.NoOfWheels,
});
}
}


Интерфейс IServiceProvider также получил методы GetRequiredKeyedService (и GetKeyedService, чтобы избежать исключения при null).
var car = _serviceProvider
.GetRequiredKeyedService<IVehicle>("car");

Источник: https://www.roundthecode.com/dotnet-tutorials/keyed-services-dotnet-8-dependency-injection-update
  • 👍 40
  • 👎 2
More from @netdeveloperdiary
  1. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  2. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  3. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  4. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  5. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  6. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →