Как получить зарегистрированный сервис по его конкретному типу, а не по типу интерфейса? - PullRequest
0 голосов
/ 31 мая 2018

Предположим, у меня есть следующие классы и интерфейсы:

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эс.Я могу получить их только по типу интерфейса.

1 Ответ

0 голосов
/ 31 мая 2018

Попробуйте зарегистрировать тип напрямую так:

public void ConfigureServices(IServiceCollection services)
{
    // container will create the instance of this type
    services.AddScoped<ConcreteRepository>();
}

Тогда вы сможете разрешить тип напрямую с помощью

var concreteRepositoryInstance =  
         httpContext.RequestServices.GetService(typeof(ConcreteRepository))
              as IEntityOwner;
...