.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中使用泛型进行依赖注入!
.NET中 泛型 + 依赖注入 的实现与应用的更多相关文章
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...
- Spring基础—— 泛型依赖注入
一.为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入. 二.泛型依赖注入:子类之间的依赖关系由其父类泛型以及父类之 ...
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(三)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- Spring的泛型依赖注入
Spring 4.x 中可以为子类注入子类对应的泛型类型的成员变量的引用,(这样子类和子类对应的泛型类自动建立关系)具体说明: 泛型注入:就是Bean1和Bean2注入了泛型,并且Bean1和Bean ...
- 转载--浅谈spring4泛型依赖注入
转载自某SDN-4O4NotFound Spring 4.0版本中更新了很多新功能,其中比较重要的一个就是对带泛型的Bean进行依赖注入的支持.Spring4的这个改动使得代码可以利用泛型进行进一步的 ...
- Spring初学之泛型依赖注入
主要讲泛型依赖注入,所以核心在java文件,配置文件中只需配置扫描包即可,如下: <?xml version="1.0" encoding="UTF-8" ...
- Autofac 泛型依赖注入
using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...
- Spring4学习回顾之路10-Spring4.x新特性:泛型依赖注入
泛型依赖注入:Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用. 话语太过抽象,直接看代码案例,依次建立如下代码: User.java package com.lql.sprin ...
- 【串线篇】spring泛型依赖注入原理
spring泛型依赖注入原理 不管三七二十一 servlet :加注解@servlet service:加注解@service dao:加注解@Repository 这相当于在容器中注册这些个类
随机推荐
- 基于.NetCore开发博客项目 StarBlog - (32) 第一期完结
前言 本文记录一下 StarBlog 项目的当前状态与接下来 v2 版本的开发规划. StarBlog 项目从 2022 年开始至今已经 2 年多了,本来早就该给第一期做个小结的,但这种博客类型的项目 ...
- 张高兴的 Raspberry Pi AI 开发指南:(三)将自定义模型编译为 Hailo NPU 的 .hef 模型
目录 Python 环境配置 转换 量化 编译 参考 在上一篇博客中,探讨了如何使用 Python 和 hailo_model_zoo 中预编译的模型来实现目标检测.本篇博客将深入介绍如何将用户自定义 ...
- Oracle无法远程连接的原因及解决办法
前提 虚拟机Linux(centos7)下静默安装Oracle数据库,本地能访问.文章参考:Linux-CentOS7下安装Oracle11g - sankuoshu - 博客园 (cnblogs.c ...
- Pytest接口自动化测试框架Python自动化测试开发
一.引言 在软件开发过程中,接口测试是确保软件各个组件之间数据传输和功能交互正常工作的重要环节.通过接口测试,可以提高软件的整体质量和稳定性.Pytest是一个流行的Python自动化测试框架,提供了 ...
- idea中yaml文件中文乱码问题解决
idea打开yaml,或是properties文件,出现中文乱码. 解决步骤: 打开notepad++ ,新建iso-8859-1编码的空文件 将乱码文件通过notepad++直接打开,把正常显示的代 ...
- # 为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因
为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因 https://codeopinion.com/why-use-mediatr-3-reasons-why-and-1-reaso ...
- Dapr-3: 从 20000 英尺之上俯瞰 Dapr
第 3 章 从 20000 英尺之上俯瞰 Dapr Dapr at 20,000 feet | Microsoft Docs 在第 1 章中,我们讨论了分布式微服务应用的吸引力.但是,我们也指出了它会 ...
- Winform 使用WebView2 开发现代应用
使用 WebView2 开发现代应用 WebView2 是 Microsoft 提供的一种嵌入式浏览器控件,基于 Edge (Chromium) 引擎.它允许开发者将现代 Web 技术(如 HTML. ...
- 中电金信:零售经营“新赛道” ——基于手机银行APP专区调研的客群精细化运营分析报告
随着银行业竞争的不断深入及新客户增量日渐"到顶",各家银行的客群竞争逐渐由"跑马圈地"进入"精耕细作"的新阶段,在客群精准化服务方面不断深 ...
- 2024年1月Java项目开发指南4:IDEA里配置MYSQL
提前声明:文章首发博客园(cnblogs.com/mllt) 自动"搬家"(同步)到CSDN,如果博客园中文章发生修改是不会同步过去的,所以建议大家到我的博客园中查看 前提条件: ...