Generics 在.NET Core中的特定通用服务上定义注入服务

Generics 在.NET Core中的特定通用服务上定义注入服务,generics,.net-core,dependency-injection,Generics,.net Core,Dependency Injection,我正在寻找一种在.NET内核中使用DI的正确方法,下面是一个示例 我得到了从ILogger服务继承的LoggerStandardService。 它被很好地注入到服务中(EntityRepository,EntityRepository),但我想定义另一个LoggerCustomService来注入一些特定的通用服务,例如EntityRepository 下面是执行这类操作的代码 public interface IEntityRepository<T> where T : clas

我正在寻找一种在.NET内核中使用DI的正确方法,下面是一个示例

我得到了从
ILogger
服务继承的
LoggerStandardService
。 它被很好地注入到服务中(
EntityRepository
EntityRepository
),但我想定义另一个
LoggerCustomService
来注入一些特定的通用服务,例如
EntityRepository

下面是执行这类操作的代码

public interface IEntityRepository<T> where T : class { }

public class EntityRepository<T> : IEntityRepository<T>
    where T : class
{
    public EntityRepository(IDbContext context, ILogger logger)
    {
        //Do some stuff
    }
}

public interface ILogger { }

public class LoggerStandardService : ILogger { }

public class LoggerCustomService : ILogger { }
公共接口IEntityRepository,其中T:class{}
公共类实体存储库:IENTITY存储库
T:在哪里上课
{
公共实体报告(IDbContext上下文,ILogger记录器)
{
//做点什么
}
}
公共接口ILogger{}
公共类LoggerStandardService:ILogger{}
公共类LoggerCustomService:ILogger{}
在Startup.cs中:

public void配置服务(IServiceCollection服务)
{
services.addScope();
services.addScope();
services.addScope();
services.addScope();
services.addScope();
services.AddScoped
(x=>
新实体报告(
x、 GetRequiredService(),
x、 GetRequiredService());

执行此操作是否正确?避免在
EntityRepository
构造函数中定义所有其他注入服务。

您试图完成的正确术语是基于上下文的注入或上下文注入,其中依赖项的实现基于其上下文(如您的案例中的父项)

Microsoft的内置DI容器(MS.DI)对此没有很好的支持,这通常意味着您必须使用变通方法,如您应用的变通方法。变通方法的缺点是无法在泛型类型上使用自动注册,例如:

services.addScope(typeof(ientyrepository)、typeof(EntityRepository));
通过此注册,您可以告诉DI女士将
IEntityRepository
的任何封闭通用版本映射到
EntityRepository
的兼容封闭通用实现。这样您就不必注册
IEntityRepository
IEntityRepository
IEntityRepositorye> IEntityRepository
,等等。此功能是许多DI容器具有的一个极其重要的功能,因为当应用程序中有许多模型时,它可以在DI配置中节省大量维护

但不幸的是,由于MS.DI的限制,在您的情况下,您的运气不好。每个已关闭的
IEntityRepository
注册都必须显式完成,例如使用您已经展示的方法

另一个选项是使用
ActivatorUtilities
类。这使得单个
EntityRepository
注册更易于维护,因为它只允许您指定一个重写的依赖项:

services.AddScoped(x=>
ActivatorUtilities.CreateInstance(x,
x、 GetRequiredService());

ActivatorUtilities.CreateInstance
允许创建所提供的
T
的新实例,同时从所提供的服务提供商
x
解析其构造函数的所有依赖项,除非使用第二个参数
x.GetRequiredService()显式提供依赖项

你好,非常感谢!祝你今天愉快