如何通过具体类型而不是其接口类型来获取注册服务?

时间:2018-05-31 15:42:20

标签: c# dependency-injection asp.net-core-2.0

请假设我有以下类和接口:

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>();

我可以像这样得到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不提供所有服务。我只能通过接口类型来获取它们。

1 个答案:

答案 0 :(得分:3)

尝试直接注册类型

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;