IServiceCollection - это локатор сервисов?
Вот я добавляю сервис 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;
}
}
Ответы (1 шт):
Автор решения: vitidev
→ Ссылка
Нет. Это не "сервис локатор". "сервис локатор" - когда вы таскаете контейнер как зависимость, то есть код вида
public AdminController(IServiceProvider services)
{
_dbContext = services.GetRequiredService<IRepository<Network>>;
}
При таком подходе нельзя узнать что AdminController использует IRepository просто глядя на описание класса. Придется лезть в исходники и изучать тело всего класса (мало ли где там извлекается сервис из локатора).
А пока у вас зависимости явные и DI контейнер просто заполняет эти зависимости (но не прокидывается сам), то это правильный подход.