.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 这相当于在容器中注册这些个类
随机推荐
- App中第三方登录和分享模块的实现
@ 目录 1 流程 2 设计与实现 3 优化 本文目的:" 实现一套易于使用.维护的第三方登录和分享模块" 我们开发App有时为了吸引用户,会引入三方的授权登录降低用户的注册和登录 ...
- 《前端运维》一、Linux基础--08Shell其他及补充
这一篇,我们来学习一些重要的命令,在工作中也会经常用到. 一.简单正则 要注意的是,有些命令不支持正则模式,比如fs.find等,有些是支持正则的,比如grep.awk.sed等.正则的语法和js中的 ...
- 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器
1.前言 我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化.本章将要介绍的就是:@Pr ...
- Go 内存管理
操作系统内存管理 操作系统管理内存的存储单元是页(page),在 linux 中一般是 4KB.而且,操作系统还会使用 虚拟内存 来管理内存,在用户程序中,我们看到的内存是不是真实的内存,而是虚拟内存 ...
- PostgreSQL 的历史
title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功 ...
- MockQueryable:LINQ查询模拟测试工具
我们在项目开发过程中,单元测试是确保代码质量的重要环节.涉及数据库LINQ查询逻辑,就需要数据库配合,但这样可能出现性能和数据库并发等问题.下面给推荐一个开源库,为开发者提供了一种简便的方式来模拟LI ...
- Qt音视频开发16-通用悬浮按钮工具栏的设计
一.前言 通用悬浮按钮工具栏这个功能经过了好几个版本的迭代,一开始设计的时候是写在视频控件widget窗体中,当时功能简单就放一排按钮在顶部悬浮widget中就好,随着用户需求的变化,用户需要自定义悬 ...
- Qt编写物联网管理平台31-用户权限管理
一.前言 随着需求的不断变化,功能的增多,在用户信息这块,除了需要用户登录退出验证以外,还需要有个简单的用户权限逻辑处理,比如限定某些用户只有查看权限,没有删除记录.清空记录.系统设置的权限,与之相对 ...
- Qt开源作品30-农历控件
一.前言 农历控件在国产linux中必备的控件之一,毕竟要适应国人的习惯,你看win10系统的日历,现在点开来直接就有农历在上面,非常方便人性化,所以在很多用Qt做的项目中,也有农历控件的应用场景,而 ...
- UML之类与类图
在所有项目中,类都是最常见的UML模型元素(当然,不可否认,很多项目还没画出类图就直接进入编码实现的阶段了).类是UML模型与具体实现代码之间的桥梁,随着对UML建模的深入了解,我们也会发现,类(确切 ...