Предположим, у меня есть следующие классы и интерфейсы:
public class ConcreteRepository : IRepository<T>, IEntityOwner
{ }
public interface IRepository<T>
{ }
public interface IEntityOwner
{ }
public class SomeModel
{ }
и предположим, что я зарегистрировал следующую службу в своем классе запуска Asp.Net Core 2.0:
services.AddScoped<IRepository<SomeModel>, ConcreteRepository>();
Iможно получить экземпляр ConcreteRepository следующим образом:
var concreteRepositoryInstance =
httpContext.RequestServices.GetService(typeof(IRepository<SomeModel>))
as IRepository<SomeModel>;
Как получить экземпляр ConcreteRepository по типу ConcreteRepository?
Я представляю что-то вроде этого:
var concreteRepositoryInstance =
httpContext.RequestServices.GetService(typeof(ConcreteRepository))
as IEntityOwner;
Обратите внимание, что я не могу использовать какие-либо обобщения для ответа на мой вопрос, потому что мой вариант использования относится к пользовательскому атрибуту, который принимает тип concreteRepository в качестве входного параметра (и атрибуты не могут быть дженериками по замыслу).
То, что я до сих пор пробовал:
(a) Я проверил и попробовал все методы httpContext.RequestServices.GetService...
, но все они требуют тип интерфейса, с которым зарегистрирован конкретный тип.
(b) Я думал о получении всех сервисов из контейнера зависимостей, но IServiceProvider не предлагает получить all servicэс.Я могу получить их только по типу интерфейса.