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

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


‌一、IServiceCollection:服务注册‌

  1. ‌核心职责‌

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

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

      复制代码

      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)的核心思想:将依赖的创建与使用分离,提升代码的可维护性和可测试性‌。
相关推荐
考虑考虑1 小时前
nginx路由重写
运维·后端·自动化运维
吴建旭 智宅焕2 小时前
智能家居交付计价模型的设计与实现:按时间计费与交付确定性架构
架构·智能家居
JaguarJack2 小时前
PHP 紧急修复两项严重 RCE 漏洞,8.2 至 8.5 用户应立即升级
后端·php·服务端
小羊没烦恼!2 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
BingoGo2 小时前
PHP 紧急修复两项严重 RCE 漏洞,8.2 至 8.5 用户应立即升级
后端·php
金銀銅鐵2 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程
斌糖雪梨3 小时前
spring auth 核心流程详解
java·后端·spring
昂好的day4 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
高频因子挖掘机4 小时前
本地已有一年历史数据,第二天更新别只拉“昨天一天”:量化 K 线增量同步实践
后端·github·api
高频因子挖掘机4 小时前
只补缺失日期,不重拉全部历史:增量更新 K 线应该怎么设计?
后端·github·api