1.多个 .NET Core SDK 版本之间进行切换 global.json2.HttpClientHandler VS SocketsHttpHandler3..Net Core中使用DiagnosticSource进行日志记录4.DiagnosticSource DiagnosticListener 无侵入式分布式跟踪5.LoggerMessageAttribute 高性能的日志记录6..Net Core 你必须知道的source-generators7..NET Core使用 CancellationToken 取消API请求8.使用 LogProperties source generator 丰富日志9..Net Core 使用 TagProvider 与 Enricher 丰富日志10.C# 12 拦截器 Interceptors11.为什么推荐在 .NET 中使用 YAML 配置文件12..NET 9 中的 多级缓存 HybridCache13..NET 9 增强 OpenAPI 规范,不再内置swagger14.Scoop: 开发者多环境管理利器15.在 .NET 中使用 Tesseract 识别图片文字16.AsyncLocal的妙用17..NET最佳实践:webapi返回IAsyncEnumerable提升性能18..NET最佳实践:避免滥用Task.Run19..NET最佳实践:避免同步读取HttpRequest20..NET最佳实践:业务逻辑减少使用异常
21..NET中 泛型 + 依赖注入 的实现与应用
在.NET中,注入泛型依赖项是一个常见的场景。
在依赖注入(DI)中使用泛型可以使得应用程序更加模块化、易于测试和扩展。
在ASP.NET Core中注册泛型服务
假设我们有一个需要注入的泛型接口 IRepository<T>
和实现类 Repository<T>
。
public interface IRepository<T>
{
T GetById(int id);
}
public class Repository<T> : IRepository<T>
{
public T GetById(int id)
{
// 模拟从数据库中获取数据
return default(T);
}
}
接下来,我们需要将 Repository<T>
注册到DI容器中。
在ASP.NET Core中,可以通过 AddTransient
、AddScoped
或 AddSingleton
方法来注册服务。
为了支持泛型,我们可以使用以下方式:
public void ConfigureServices(IServiceCollection services)
{
// 注册泛型服务
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
}
这段代码做了以下几件事:
IRepository<>
是一个泛型接口,表示任何类型的IRepository<T>
。Repository<>
是一个泛型类,它实现了IRepository<T>
。
注入泛型服务
当你想在控制器或其他类中使用 IRepository<T>
时,你可以通过构造函数注入的方式来获取它。
public class MyController : Controller
{
private readonly IRepository<MyEntity> _repository;
public MyController(IRepository<MyEntity> repository)
{
_repository = repository;
}
public IActionResult GetEntity(int id)
{
var entity = _repository.GetById(id);
return Ok(entity);
}
}
在这个例子中,MyController
会自动获取类型为 IRepository<MyEntity>
的实例。
ASP.NET Core的依赖注入容器会根据泛型类型自动解析并提供 Repository<MyEntity>
。
泛型工厂方法
如果你需要基于不同的类型动态创建泛型服务,可以使用泛型工厂方法。比如,你可以在运行时根据条件选择不同的服务实现。
public interface IFactoryService
{
IRepository<T> CreateRepository<T>();
}
public class FactoryService : IFactoryService
{
private readonly IServiceProvider _serviceProvider;
public FactoryService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IRepository<T> CreateRepository<T>()
{
return _serviceProvider.GetRequiredService<IRepository<T>>();
}
}
在 FactoryService
类中,我们使用 IServiceProvider
来手动解析泛型类型。然后,我们将 FactoryService
注册到DI容器中:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
services.AddTransient<IFactoryService, FactoryService>();
}
这样,你就可以通过 FactoryService
动态创建任何类型的 IRepository<T>
。
小结
在.NET中,注入泛型服务是非常简单的。通过使用ASP.NET Core的依赖注入框架,你可以:
- 注册泛型接口和实现类。
- 在控制器或服务中通过构造函数注入泛型服务。
- 使用工厂方法动态创建泛型服务。
这些功能使得你的代码更具灵活性和可扩展性。希望这篇文章能够帮助你更好地理解如何在ASP.NET Core中使用泛型进行依赖注入!

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库