请假设我有以下类和接口:
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不提供所有服务。我只能通过接口类型来获取它们。
答案 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;