导读:本期聚焦于小伙伴创作的《C#的依赖注入(DI)是什么?如何在ASP.NET Core中配置和使用?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#的依赖注入(DI)是什么?如何在ASP.NET Core中配置和使用?》有用,将其分享出去将是对创作者最好的鼓励。

C#的依赖注入(DI)是一种实现控制反转(IoC)的设计模式,核心思想是将对象的依赖关系由外部容器来管理和注入,而不是在对象内部自行创建依赖实例。这种方式可以让代码组件之间的耦合度大幅降低,后续修改依赖实现或者进行单元测试时都会更加方便。ASP.NET Core从框架层面内置了依赖注入容器,开发者不需要引入额外的第三方库就可以直接使用相关功能。

C#的依赖注入(DI)是什么?如何在ASP.NET Core中配置和使用?

依赖注入的核心概念

依赖注入主要包含三个角色:服务(被依赖的组件)、服务容器(管理服务的注册和生命周期)、消费者(需要使用服务的组件)。在ASP.NET Core中,服务容器由IServiceProvider接口表示,服务的注册和配置通过IServiceCollection接口完成。

常见的依赖注入方式有三种:

  • 构造函数注入:通过消费者的构造函数传入依赖的服务,是ASP.NET Core中最推荐的使用方式
  • 属性注入:通过公共属性设置依赖的服务,ASP.NET Core默认不支持,需要额外配置
  • 方法注入:通过方法的参数传入依赖的服务,适合临时使用某个依赖的场景

ASP.NET Core中配置依赖注入的步骤

1. 定义服务接口和实现类

首先我们需要定义一个需要被注入的服务,通常先定义接口,再实现具体的类,这样后续可以方便地替换实现。

// 定义服务接口
public interface IUserService
{
    string GetUserName(int userId);
}

// 实现服务接口
public class UserService : IUserService
{
    public string GetUserName(int userId)
    {
        // 模拟从数据库获取用户名称的逻辑
        return $"用户{userId}";
    }
}

2. 在Program.cs中注册服务

ASP.NET Core的服务注册都在Program.cs文件的构建主机过程中完成,通过IServiceCollection的扩展方法来添加服务。服务的生命周期有三种可选,开发者需要根据实际场景选择:

生命周期说明
Transient每次请求服务时都会创建一个新的实例,适合轻量级的、无状态的服务
Scoped在同一个请求范围内,多次获取服务会返回同一个实例,适合需要保持请求内状态的服务
Singleton整个应用程序生命周期内只会创建一个实例,适合全局共享的服务

注册服务的代码示例如下:

var builder = WebApplication.CreateBuilder(args);

// 注册服务,这里选择Transient生命周期
builder.Services.AddTransient<IUserService, UserService>();

// 也可以注册其他框架内置的服务,比如控制器
builder.Services.AddControllers();

var app = builder.Build();

// 配置中间件
app.MapControllers();

app.Run();

3. 在组件中注入服务

ASP.NET Core中控制器、页面模型、中间件等组件都支持构造函数注入,只需要在构造函数中声明对应的服务类型作为参数即可,容器会自动解析并传入实例。

控制器中注入服务的示例:

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

    // 构造函数注入,容器会自动传入IUserService的实例
    public UserController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet("{id}")]
    public string GetUserName(int id)
    {
        return _userService.GetUserName(id);
    }
}

注意事项

在使用依赖注入时需要注意几个问题:

  • 避免循环依赖,即A依赖B,B又依赖A,这种情况会导致容器解析失败抛出异常
  • 合理选择服务的生命周期,比如如果服务依赖了Scoped生命周期的组件,那么服务本身也应该是Scoped或者更短的生命周期,否则会出现作用域问题
  • 不要手动new依赖的服务实例,而是通过容器注入,否则会失去依赖注入的优势
依赖注入并不是ASP.NET Core独有的功能,普通的C#控制台程序也可以通过引入Microsoft.Extensions.DependencyInjection包来使用依赖注入容器,使用方式和ASP.NET Core中的配置逻辑基本一致。

依赖注入ASP.NET_CoreIServiceCollectionServiceLifetime构造函数注入修改时间:2026-06-19 12:09:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。