设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

查看: 945|回复: 2

深入理解 ASP.NET Core 依赖注入(DI)的实现

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
24
主题
22
精华
0
金钱
78
积分
46
注册时间
2023-9-29
最后登录
2025-8-31

发表于 2025-8-31 14:19:08 | 显示全部楼层 |阅读模式

在现代软件开发中,依赖注入(Dependency Injection,简称 DI)是一种常见的设计模式,旨在减少类之间的耦合性,提高代码的可维护性、可扩展性以及测试性。ASP.NET Core 作为一个高度灵活且现代化的 Web 开发框架,内置支持依赖注入,使得开发者能够更容易地管理服务的生命周期,自动注入依赖项,从而简化应用程序的开发和维护。

本文将深入讲解 ASP.NET Core 中的依赖注入,包括其基本概念、实现原理、使用方法以及一些高级技巧,帮助开发者全面理解和应用这一强大的功能。

1. 依赖注入的基础概念

1.1 什么是依赖注入?

依赖注入(DI)是一种设计模式,它将类的依赖项(例如其他服务或对象)通过构造函数、属性或方法传入,而不是让类自己去创建或查找这些依赖项。简单来说,依赖注入就是让一个类的依赖项在外部创建并传递给该类,而不是由类内部创建。

通过依赖注入,我们可以:

  • 减少类之间的耦合性:使得各个类的依赖关系更加明确,降低了类与类之间的紧密联系。
  • 提高可测试性:由于依赖项被注入,可以轻松替换成假对象(mock)或替代实现,简化单元测试。
  • 增加可维护性:可以在应用中集中管理依赖关系,方便修改和扩展。

1.2 控制反转(IoC)和依赖注入

依赖注入的工作方式是基于 控制反转(Inversion of Control,IoC) 模式的。通常,类会主动创建它所依赖的其他类的实例,而在 IoC 模式下,控制权被反转,实例的创建交给外部容器进行管理。这使得类不再负责创建依赖对象,从而提升了代码的灵活性和可测试性。

2. ASP.NET Core 中的依赖注入容器

在 ASP.NET Core 中,依赖注入是由内置的 依赖注入容器(DI container) 处理的。这个容器负责管理应用程序中服务的生命周期,自动解析并将依赖项注入到需要它们的类中。

2.1 依赖注入的生命周期

ASP.NET Core 的 DI 容器管理服务的生命周期。生命周期决定了服务实例的创建和销毁时机,常见的有三种:

  • Transient(瞬态服务)

    • 每次请求都会创建一个新的服务实例。
    • 适用于无状态、轻量级的服务。
    • 示例:
      1. services.AddTransient<IEmailService, EmailService>();
      复制代码
  • Scoped(作用域服务)

    • 每个 HTTP 请求会创建一个新的服务实例,且该实例在同一请求内共享。
    • 适用于需要在单个请求生命周期中共享的服务,例如数据库上下文。
    • 示例:
      1. services.AddScoped<IUnitOfWork, UnitOfWork>();
      复制代码
  • Singleton(单例服务)

    • 整个应用程序生命周期内只有一个实例,所有请求共享这个实例。
    • 适用于无状态且跨多个请求共享的服务。
    • 示例:
      1. services.AddSingleton<ICacheService, CacheService>();
      复制代码

2.2 服务注册

在 ASP.NET Core 中,服务的注册通常发生在 

  1. Startup.cs
复制代码
 文件的 
  1. ConfigureServices
复制代码
 方法中。我们使用 
  1. IServiceCollection
复制代码
 接口的扩展方法将服务注册到 DI 容器中。

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. // 注册瞬态服务
  4. services.AddTransient<IMyService, MyService>();
  5. // 注册作用域服务
  6. services.AddScoped<IUnitOfWork, UnitOfWork>();
  7. // 注册单例服务
  8. services.AddSingleton<IEmailService, EmailService>();
  9. }
复制代码

  1. IServiceCollection
复制代码
 提供了三种服务注册方法:

    1. AddTransient
    复制代码
    :用于注册瞬态服务。
    1. AddScoped
    复制代码
    :用于注册作用域服务。
    1. AddSingleton
    复制代码
    :用于注册单例服务。

3. 依赖注入的工作原理

ASP.NET Core 中的依赖注入是基于 控制反转(IoC) 和 依赖注入(DI) 模式的。下面是依赖注入工作流程的简要说明:

  • 服务注册: 在 

    1. ConfigureServices
    复制代码
     方法中,我们将服务与其实现类注册到 DI 容器中。容器会根据服务的生命周期要求,决定何时创建和销毁实例。

  • 请求处理: 当 HTTP 请求到达 ASP.NET Core 应用时,DI 容器会根据请求所需的依赖项自动解析并将其注入。控制器、服务和中间件都可以通过构造函数注入来获取所需的服务。

  • 服务解析: 当一个类(例如控制器)需要某个服务时,ASP.NET Core 会自动查找并注入这些依赖项。这是通过构造函数注入、属性注入或方法注入来实现的。

  • 生命周期管理

    • 瞬态服务:每次请求都会创建一个新的实例。
    • 作用域服务:每个请求会创建一个新的实例,并在同一请求生命周期内共享。
    • 单例服务:整个应用程序生命周期内只有一个实例,所有请求共享。

4. 使用依赖注入

4.1 构造函数注入

构造函数注入是最常见的依赖注入方式。在这种方式中,依赖项通过构造函数传递给类。ASP.NET Core 会自动创建和注入依赖项。

  1. public class MyController : Controller
  2. {
  3. private readonly IMyService _myService;
  4. // 构造函数注入
  5. public MyController(IMyService myService)
  6. {
  7. _myService = myService;
  8. }
  9. public IActionResult Index()
  10. {
  11. // 使用注入的服务
  12. var result = _myService.GetData();
  13. return View(result);
  14. }
  15. }
复制代码

在这个示例中,

  1. IMyService
复制代码
 服务通过构造函数注入到 
  1. MyController
复制代码
 控制器中。ASP.NET Core 会自动处理 
  1. IMyService
复制代码
 的实例化,并注入到控制器中。

4.2 属性注入

属性注入允许我们通过公共属性将依赖项注入到类中。虽然不如构造函数注入常见,但在某些特定场景下仍然有效。

  1. public class MyController : Controller
  2. {
  3. // 属性注入
  4. public IMyService MyService { get; set; }
  5. public IActionResult Index()
  6. {
  7. var result = MyService.GetData();
  8. return View(result);
  9. }
  10. }
复制代码

需要注意的是,属性注入不如构造函数注入直观,因为依赖关系是隐式的,且对服务的访问可能不会被显式验证,可能导致更难进行单元测试。

4.3 方法注入

方法注入是通过方法参数注入依赖项。ASP.NET Core 支持在方法中使用 

  1. [FromServices]
复制代码
 特性来实现方法注入。

  1. public class MyController : Controller
  2. {
  3. public IActionResult Index([FromServices] IMyService myService)
  4. {
  5. var result = myService.GetData();
  6. return View(result);
  7. }
  8. }
复制代码

方法注入允许你在方法调用时,显式地指定需要注入的服务。

5. 高级技巧

5.1 依赖注入的范围管理

在某些情况下,可能需要手动创建服务作用域。我们可以使用 

  1. IServiceScopeFactory
复制代码
 来动态创建作用域并解析服务:

  1. public class MyScopedService
  2. {
  3. private readonly IServiceScopeFactory _serviceScopeFactory;
  4. public MyScopedService(IServiceScopeFactory serviceScopeFactory)
  5. {
  6. _serviceScopeFactory = serviceScopeFactory;
  7. }
  8. public void CreateScope()
  9. {
  10. using (var scope = _serviceScopeFactory.CreateScope())
  11. {
  12. var myService = scope.ServiceProvider.GetRequiredService<IMyService>();
  13. // 使用 myService
  14. }
  15. }
  16. }
复制代码

5.2 自定义依赖注入容器

ASP.NET Core 默认使用 Microsoft.Extensions.DependencyInjection 提供的 DI 容器,然而也可以使用其他依赖注入框架,如 Autofac 或 Ninject,如果你需要更高级的特性。但对于大多数应用来说,ASP.NET Core 内置的 DI 容器已经能够很好地满足需求。

6. 总结

ASP.NET Core 的依赖注入功能大大简化了服务的管理和依赖关系的注入。通过了解依赖注入的基本原理、服务生命周期以及构造函数注入、属性注入和方法注入的使用方式,开发者可以更好地构建可维护、可扩展的应用程序。依赖注入不仅是一个技术实现,更是一种设计哲学,它倡导将系统中的依赖关系显式地管理和注入,从而提高系统的灵活性和可测试性。掌握依赖注入,能够让你的应用程序更加高效和健壮。

到此这篇关于深入理解 ASP.NET Core 依赖注入(DI)的实现的文章就介绍到这了,更多相关 ASP.NET Core 依赖注入内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2025-11-9 09:19:30 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
25
积分
30
注册时间
2022-12-27
最后登录
2022-12-27

发表于 3 天前 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表