在.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中 泛型 + 依赖注入 的实现与应用的更多相关文章

  1. ASP.NET Core中的依赖注入(3): 服务的注册与提供

    在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...

  2. Spring基础—— 泛型依赖注入

    一.为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入. 二.泛型依赖注入:子类之间的依赖关系由其父类泛型以及父类之 ...

  3. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(三)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  4. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  5. Spring的泛型依赖注入

    Spring 4.x 中可以为子类注入子类对应的泛型类型的成员变量的引用,(这样子类和子类对应的泛型类自动建立关系)具体说明: 泛型注入:就是Bean1和Bean2注入了泛型,并且Bean1和Bean ...

  6. 转载--浅谈spring4泛型依赖注入

    转载自某SDN-4O4NotFound Spring 4.0版本中更新了很多新功能,其中比较重要的一个就是对带泛型的Bean进行依赖注入的支持.Spring4的这个改动使得代码可以利用泛型进行进一步的 ...

  7. Spring初学之泛型依赖注入

    主要讲泛型依赖注入,所以核心在java文件,配置文件中只需配置扫描包即可,如下: <?xml version="1.0" encoding="UTF-8" ...

  8. Autofac 泛型依赖注入

    using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...

  9. Spring4学习回顾之路10-Spring4.x新特性:泛型依赖注入

    泛型依赖注入:Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用. 话语太过抽象,直接看代码案例,依次建立如下代码: User.java package com.lql.sprin ...

  10. 【串线篇】spring泛型依赖注入原理

    spring泛型依赖注入原理 不管三七二十一 servlet :加注解@servlet service:加注解@service dao:加注解@Repository 这相当于在容器中注册这些个类

随机推荐

  1. npm depcheck 包依赖检查

    1.概述 在前端开发时,如果经常会遇到一些依赖的问题,比如一个项目,之前在 package.json安装了某个包,后来又删除了这个包,但是node_modules 包还是在的,但是我们把代码给其他人安 ...

  2. 原生JS点名器,随机数

    因为工作内容的需要自己琢磨了一个随机数的点名器,很早就写出了一版,今天无意间又看到了之前写的代码,还是有很多bug的,今天做了完善在这里分享给大家 <script type="text ...

  3. vue3 学习笔记(不断更新中...)(2024.11.13)

    组合式API setup() 11 响应式API ref ref 用于创建响应式数据(通常用来定义 基本类型数据) 在JavaScript代码中,需要使用 .value 来操作数据 let count ...

  4. StreamJsonRpc.ConnectionLostException 在请求完成之前, 与远程方的 JSON-RPC 连接已丢失

    今天电脑重启之后,发现 visual studio 2022 的智能提示与报错经常性不好用,不光不能在正常时候提示代码错误信息,甚至在编译过后也不提示错误.反复重启,刚开始正常,隔一会儿就会提示什么什 ...

  5. 【MyBatis】学习笔记05:获取参数值的两种方式

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  6. 使用JSch进行sftp的连接运行状况检查

    public boolean checkConnection() throws JSchException { try { JSch jsch = new JSch(); Session sessio ...

  7. win10家庭版升级到专业版密钥

    J7QT3-3GCPG-9GVWT-CH2XR-GMRJM

  8. 哪里有 class 告诉我?

    说明 本文中的 JVM 参数和代码在 JDK 8 版本生效. 哪里有用户类? 用户类是由开发者和第三方定义的类,它是由应用程序类加载器加载的. Java 程序可以通过CLASSPATH 环境变量,JV ...

  9. Qt编写的项目作品19-图片及视频TCP/UDP网络传输

    一.功能特点 多线程收发图片数据和解析图片数据,不卡主界面. 同时支持TCP和UDP两种模式,封装了TCP模式以及UDP模式的客户端类和服务端类. 图片传输客户端同时支持发送到多个服务端,可以作为一个 ...

  10. JavaScript中find()和 filter()方法的区别小结

    前言 JavaScript 在 ES6 上有很多数组方法,每种方法都有独特的用途和好处. 在开发应用程序时,大多使用数组方法来获取特定的值列表并获取单个或多个匹配项. 在列出这两种方法的区别之前,我们 ...