0

0

C# 怎么在 ASP.NET Core 中实现依赖注入_C# ASP.NET Core 依赖注入实战教程

幻夢星雲

幻夢星雲

发布时间:2025-11-12 21:03:13

|

748人浏览过

|

来源于php中文网

原创

答案是依赖注入通过内置容器实现服务的松耦合管理。在Program.cs中注册Scoped、Singleton、Transient生命周期的服务,推荐面向接口编程,在控制器构造函数中注入依赖,注意避免Singleton服务中直接引用Scoped/Transient服务,必要时可通过IServiceProvider手动获取实例,正确使用可提升代码可维护性和测试性。

c# 怎么在 asp.net core 中实现依赖注入_c# asp.net core 依赖注入实战教程

在 ASP.NET Core 中,依赖注入(Dependency Injection, DI)是框架内置的核心功能之一。它帮助开发者实现松耦合、可测试和可维护的代码结构。下面通过实际示例说明如何在 C# 的 ASP.NET Core 项目中正确使用依赖注入。

什么是依赖注入

依赖注入是一种设计模式,用于将对象的创建和使用分离。类不再自己创建依赖项,而是由外部容器“注入”所需的服务。ASP.NET Core 内置了一个轻量级的服务容器,可以自动管理服务的生命周期并注入到控制器、中间件或其他服务中。

注册服务到依赖注入容器

Program.cs 文件中,你可以通过 builder.Services 将服务添加到容器中。常见的注册方式有三种:

  • Scoped:每次 HTTP 请求创建一个实例
  • Singleton:整个应用生命周期内只创建一个实例
  • Transient:每次请求服务时都创建新实例


// Program.cs
var builder = WebApplication.CreateBuilder(args);

// 添加服务到容器
builder.Services.AddScoped();
builder.Services.AddSingleton();
builder.Services.AddTransientailNotificationService>();

builder.Services.AddControllers();

var app = builder.Build();
app.MapControllers();
app.Run();

定义接口与实现类

为了更好地使用 DI,推荐面向接口编程。例如:


public interface IUserService
{
string GetUserName(int id);
}

public class UserService : IUserService
{
public string GetUserName(int id)
{
return $"用户_{id}";
}
}

然后在控制器中直接注入:

绘蛙AI修图
绘蛙AI修图

绘蛙平台AI修图工具,支持手脚修复、商品重绘、AI扩图、AI换色

下载


[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
private readonly IUserService _userService;

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

[HttpGet("{id}")]  
public IActionResult Get(int id)  
{  
    var name = _userService.GetUserName(id);  
    return Ok(new { Id = id, Name = name });  
}  

}

服务生命周期注意事项

选择合适的生命周期很重要,错误使用可能导致内存泄漏或数据错乱:

  • 数据库上下文通常注册为 Scoped
  • 全局配置缓存适合用 Singleton
  • 轻量级、无状态工具类可用 Transient

注意:不要在 Singleton 服务中注入 Scoped 或 Transient 服务,除非你手动控制其作用域,否则可能引发意外行为。

从容器中获取服务(不推荐常规使用)

大多数情况下应通过构造函数注入。但在某些场景(如中间件、静态上下文),可以使用服务提供者:


using (var scope = app.Services.CreateScope())
{
var userService = scope.ServiceProvider.GetService();
var name = userService?.GetUserName(1);
}

基本上就这些。掌握好依赖注入,能让你的 ASP.NET Core 应用更清晰、更易扩展。

相关专题

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

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

175

2024.05.11

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

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

212

2025.12.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

521

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

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

189

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

26

2025.12.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 39.7万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

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

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