0

0

.NET如何实现依赖注入(Dependency Injection)

煙雲

煙雲

发布时间:2025-11-17 05:59:35

|

803人浏览过

|

来源于php中文网

原创

答案:.NET 中依赖注入通过内置容器实现控制反转,支持 Transient、Scoped、Singleton 三种生命周期,在 Program.cs 中注册服务,如 AddTransient、AddScoped、AddSingleton;最常用构造函数注入,DI 容器自动解析依赖;属性和方法注入较少用,可通过 [FromServices] 实现方法参数注入;可使用 IServiceProvider 获取服务但应避免服务定位器模式;合理规划生命周期可提升解耦与测试性。

.net如何实现依赖注入(dependency injection)

.NET 中的依赖注入(Dependency Injection, DI)是一种设计模式,用于实现控制反转(IoC),让对象的依赖关系由外部容器提供,而不是在类内部直接创建。.NET(特别是 ASP.NET Core)内置了轻量级的 DI 容器,使用起来非常方便。

1. 服务注册(Service Registration)

Program.csStartup.cs(旧版本)中,通过 IServiceCollection 注册服务。.NET 支持三种生命周期:

  • Transient:每次请求都创建新实例,适合轻量、无状态服务。
  • Scoped:每个 HTTP 请求共享一个实例,适合 Web 应用中的上下文相关服务。
  • Singleton:整个应用程序生命周期内只创建一个实例。

示例代码:

builder.Services.AddTransient();
builder.Services.AddScoped();
builder.Services.AddSingleton();

2. 构造函数注入(Constructor Injection)

最常见的方式是通过构造函数将依赖传入。DI 容器会自动解析并注入所需服务。

例如:

public class UserController : ControllerBase
{
   private readonly IUserService _userService;

   public UserController(IUserService userService)
   {
      _userService = userService;
   }
}

只要 IUserService 已注册,运行时就会自动注入。

笔启AI论文
笔启AI论文

专业高质量、低查重,免费论文大纲,在线AI生成原创论文,AI辅助生成论文的神器!

下载

3. 属性注入和方法注入(较少使用)

.NET 内置容器主要支持构造函数注入。若需属性或方法注入,通常要结合第三方容器如 Autofac 或 Microsoft.Extensions.DependencyInjection 的扩展机制。

但可通过 [FromServices] 在控制器方法中实现方法参数注入:

[HttpGet]
public IActionResult Get([FromServices] ILogger logger)
{
   // 使用 logger
   return Ok();
}

4. 使用 IServiceProvider 获取服务(慎用)

在某些场景下(如中间件或静态上下文),可直接从服务容器获取实例:

var userService = scope.ServiceProvider.GetRequiredService();

注意:避免在构造函数中使用 IServiceProvider 进行“服务定位器”模式,这会隐藏依赖,不利于测试和维护。

基本上就这些。掌握服务注册和构造函数注入,就能在 .NET 项目中高效使用依赖注入。关键是合理规划服务生命周期,保持代码解耦。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

176

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

463

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

12

2025.12.06

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

402

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1613

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1942

2024.08.16

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号