Это выглядит нормально
Почти. То, что у вас есть, часто называют DI бедного человека . Правильный путь следующий (обратите внимание, что конструктор по умолчанию был удален):
private IUserRepositories _userRepo;
public UserController(IUserRepositories userRepo)
{
this._userRepo = userRepo;
}
Преимущество такого использования инверсии управления в том, что ваш контроллер слабо связан с хранилищем, что упрощает модульное тестирование в отдельности и делает различные уровни вашего приложения более пригодными для повторного использования и обслуживания.
Удаляя конструктор по умолчанию, вы четко указываете потребителям данного класса, что этот класс зависит и требует хранилище, которое должно реализовывать данный контракт (интерфейс). Это делает ваш код автоматически автоматически документированным для потребителя.