在.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中,可以通过 AddTransientAddScopedAddSingleton 方法来注册服务。

为了支持泛型,我们可以使用以下方式:

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. 论文泛读《PICCOLO : Exposing Complex Backdoors in NLP Transformer Models》

    发表时间:2022 期刊会议:IEEE Symposium on Security and Privacy (SP) 论文单位:Purdue University 论文作者:Yingqi Liu, G ...

  2. 前端好用API之scrollIntoView

    前情 在前端开发需求中,经常需要用到锚点功能,以往都是获取元素在滚动容器中的位置再设置scrollTop来实现的. scrollIntoView介绍 scrollIntoView()方法将调用它的元素 ...

  3. VTK 9.2 Qt 5.14 安装及错误处理

    参考VTK9.1.0在Windows10+VS2019+Qt 5.15.2环境下编译安装以及VTK应用于QT_vtk-qt安装包_isongxw的博客-CSDN博客 安装注意:编译release和de ...

  4. Gitbook在Docker中安装插件的方法

    别光在那百度,什么先book.json添加plugin,然后在install? 哥,你现在用的是docker哎,docker都启动不了,你如何gitbook install呢? 乖乖听我的,按我的方法 ...

  5. R数据分析:国产新冠口服药比辉瑞好的文章的统计做法分享

    元旦前在人民日报中央厨房上看到一篇文章,叫做"比肩辉瑞的国产新冠药物VV116,是这样研制和临床试验的",想来就把文献原文找来读了读,写下本文分享给大家,本文主要关注文章的正文中主 ...

  6. [AGC029D] Grid game题解

    这题很显然可以用贪心来解. 由于先手不动一定会让局数更少,所以先手要能动就动. 而后手一定是希望他的石子可以撞到一个障碍物上,这样先手就无法移动了,后手就可以让局数更少. 因为先手一定会能动就动,所以 ...

  7. 【JavaWeb】【Cookie】通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆

    通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆 Cookie类的构造方法 public Cookie(java.lang.String name,java.lang.String ) 1 ...

  8. 利用shell中awk和xargs以及sed将多行多列文本中某一列合并成一行

    一.问题描述最近需要利用Shell将多行多列文本中某一列,通过指定的分隔符合并成一行.假设需要处理的文本如下: 我们主要处理的是,将用户名提取处理,合并成一行,并通过逗号进行分隔.最终的格式如下: & ...

  9. RepeatReadRequestWrapper

    package cn.service.web.common.filter; import com.alibaba.fastjson.JSON; import org.apache.commons.io ...

  10. 关于QCustomPlot超级图表的一些冷知识点

    开源的图表控件QCustomPlot很经典,作者至少是八星斗圣级别,在曲线数据展示这块性能彪悍,总结了一些容易忽略的经验要点. 可以将XY轴对调,然后形成横向的效果,无论是曲线图还是柱状图,分组图.堆 ...