IServiceCollection - это локатор сервисов?

Рейтинг: 0Ответов: 1Опубликовано: 24.06.2023

Вот я добавляю сервис IRepository<Network> в контейнер сервисов, а потом класс AdminController использует его. Эта реализация является антипаттерн локатор сервисов?

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddTransient<IRepository<Network>, EFRepository<Network>>();

    ...
}
public class AdminController : Controller
{
    private readonly IRepository<Network> _dbContext;

    public AdminController(IRepository<Network> dbContext)
    {
        _dbContext = dbContext;
    }
} 

Ответы

▲ 2Принят

Нет. Это не "сервис локатор". "сервис локатор" - когда вы таскаете контейнер как зависимость, то есть код вида

public AdminController(IServiceProvider services)
{
    _dbContext = services.GetRequiredService<IRepository<Network>>;
}

При таком подходе нельзя узнать что AdminController использует IRepository просто глядя на описание класса. Придется лезть в исходники и изучать тело всего класса (мало ли где там извлекается сервис из локатора).

А пока у вас зависимости явные и DI контейнер просто заполняет эти зависимости (но не прокидывается сам), то это правильный подход.