NET Core中负责依赖注入和控制反转的核心组件有两个:IServiceCollection和IServiceProvider

在 .NET Core 中,依赖注入(DI)和控制反转(IoC)的核心组件为 ‌**IServiceCollection** ‌ 和 ‌**IServiceProvider**‌,二者分工明确,共同实现服务的注册与解析‌。


一、IServiceCollection:服务注册

  1. 核心职责

    • 负责‌服务注册‌,定义接口与实现类的映射关系及生命周期‌。

    • 提供扩展方法 AddTransientAddScopedAddSingleton 等,指定服务的生命周期‌。

      复制代码

      services.AddTransient<ILogger, FileLogger>(); // 瞬时生命周期

      services.AddScoped<IDatabase, SqlDatabase>(); // 作用域生命周期

      services.AddSingleton<ICache, MemoryCache>(); // 单例生命周期

  2. 生命周期类型

    • Transient‌:每次请求创建新实例。
    • Scoped‌:同一作用域(如 HTTP 请求)共享一个实例‌。
    • Singleton‌:全局共享单个实例。

二、IServiceProvider:服务解析

  1. 核心职责

    • 通过 IServiceCollection.BuildServiceProvider() 构建,用于‌解析已注册的服务‌‌。

    • 提供 GetService<T>GetRequiredService<T> 方法获取服务实例。

      复制代码

      var provider = services.BuildServiceProvider(); var logger = provider.GetService<ILogger>();

  2. 依赖注入实现

    • 支持‌构造函数注入‌、属性注入(不推荐)等方式自动解析依赖‌。

    • 示例 ‌(控制器注入):

      复制代码

      public class UserController : Controller

      {

      private readonly IUserService _userService;

      public UserController(IUserService userService) => _userService = userService; // 自动注入

      }


三、协作流程

  1. 注册阶段
    • Startup.ConfigureServices 中通过 IServiceCollection 注册服务‌。
  2. 构建容器
    • 调用 BuildServiceProvider() 生成 IServiceProvider‌。
  3. 解析阶段
    • 通过构造函数或手动从 IServiceProvider 获取服务实例‌。

四、应用场景

  1. 解耦业务逻辑
    • 通过接口抽象与实现分离,便于替换具体实现(如切换数据库、日志系统)‌。
  2. 中间件与配置集成
    • 中间件通过构造函数注入服务,配置类通过 IOptions<T> 注入‌。
  3. 资源生命周期管理
    • 合理使用生命周期避免内存泄漏(如 Scoped 生命周期释放数据库连接)‌。

总结

  • ‌**IServiceCollection** ‌ 是依赖关系的配置入口,‌**IServiceProvider**‌ 是依赖解析的执行容器‌。
  • 二者结合实现了控制反转(IoC)的核心思想:将依赖的创建与使用分离,提升代码的可维护性和可测试性‌。
相关推荐
我好喜欢你~3 小时前
C#---StopWatch类
开发语言·c#
uzong4 小时前
技术故障复盘模版
后端
GetcharZp4 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程4 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研4 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy6 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
喂完待续6 小时前
Apache Hudi:数据湖的实时革命
大数据·数据仓库·分布式·架构·apache·数据库架构
AntBlack6 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt