Как inject Generic interfaces?

Здравствуйте!
Есть генерик интерфейс :
public interface IOybek<T>
        where T : class
    {
        T GetById(int id);
    }

Для начала сделал чтобы по айдишнику показывал данные из базы данных.

имплементация интерфейса
public class Oybek<T> : IOybek<T>
        where T : class
    {
        protected DbSet<T> DbSet;
        public Oybek(MyContext context)
        {
            DbSet = context.Set<T>();
        }
        public T GetById(int id)
        {
            return DbSet.Find(id);
        }
    }


Есть следующие сущности

public class User
    {
        public User()
        {
            this.Accounts = new HashSet<Account>();
        }
        public int Id { get; set; }
        public string TelegramUserId { get; set; } = null!;
        public virtual ICollection<Account> Accounts { get; set; }
    }


public class MyItems
    {
        public int Id { get; set; }
        public string MarketHashName { get; set; } = null!;
        public int AccountId { get; set; }
        public Account? Account { get; set; } 
    }


public class Account
    {
        public Account()
        {
            this.Items = new HashSet<MyItems>();
        }
        public int Id { get; set; }
        public string SteamId { get; set; } = null!;
        public User? User { get; set; }
        public virtual ICollection<MyItems> Items { get; set; }
    }


а вот апи контроллер.

[ApiController]
    [Route("[controller]")]
    public class GetByIdController : ControllerBase
    {
        private readonly IOybek<User> _rep;
        public GetByIdController(IOybek<User> rep)
        {
            _rep = rep;
        }


        [HttpGet]
        [Route("{id}")]
        public async Task<User> GetUser(int id)
        {
            return _rep.GetById(id);
        }
    }


смотрите, в апи контроллере когда я делаю DI я пишу
private readonly IOybek _rep;

а когда делал Т то выходила ошибка.
А делать DI вот таким образом нельзя что ли ??==>
private readonly IOybek<T> _rep;
        public GetByIdController(IOybek<T> rep)
        {
            _rep = rep;
        }


Получается, в котроллере который я выше написал мне можно только работать с сущностью User?? Например, если нужны данные из сущности MyItems я должен буду создать отдельный контроллер и делать DI вот таким образом ??
private readonly IOybek<MyItems> _rep;
        public GetByIdController(IOybek<MyItems> rep)
        {
            _rep = rep;
        }
  • Вопрос задан
  • 36 просмотров
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
Чтобы можно было резолвить обобщённые интерфейсы, тебе нужно их зарегистрировать. Всё также, как и с необобщёнными интерфейсами:
services.AddScoped(typeof(IFoo<>), typeof(Foo<>));

Чтобы твой контроллер мог принимать в себя обобщённый интерфейс как параметр - сам контроллер должен быть обобщённым.
Но тут сразу возникает проблема с тем, как маршрутизировать к такому контроллеру. По тому просто так нельзя так сделать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы