尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
三种注册服务:单例,瞬时,作用域
/* 二.注册容器中的服务信息注册实例 —— 服务类型实现类型生命周期 */ containerBuilder.AddSingleton产品(); containerBuilder.AddTransient零件接口, 零件A(); // 三种注册服务 // 1.AddSingleton(单例)只创建一个单例 // 2.AddTransient(瞬时)每次获取都创建一个新对象每次调用都是一个新的对象 // 3.AddScoped(作用域)多用于Web服务(同一个会话是同一个服务)WPF中很少使用 // 1)单例 // 服务对象 实现对象 containerBuilder.AddSingleton产品(); // 2)瞬时 // 1AddTransient服务类型() 等价于 AddTransient服务类型, 实现类型()但是服务类型 实现类型 // 2AddTransient服务类型, 实现类型() 服务类型通常为接口或者基类 containerBuilder.AddTransient零件A(); containerBuilder.AddTransient零件接口, 零件A(); // 3)作用域(不会Web我就偷懒不讲了哈) // AddScoped接口或父类, 实现类() // 尝试注册 - 用法和上面一样效果 - 如果没注册就注册注册了就通过 // services.AddSingleton(); // services.AddScoped(); // services.AddTransient();2.2 三种常用注册方式这里只讲述三种最常见的注册方式类型注册实例注册和工厂注册注册方式示例容器负责创建常用程度类型注册AddXXX服务类型()服务类型 实现类型✅⭐⭐⭐⭐⭐AddXXX服务类型, 实现类型()✅⭐⭐⭐⭐实例注册AddXXX(obj)❌⭐⭐⭐工厂注册AddXXX(sp ...)部分负责⭐⭐0三种注册方式详细总结对比项类型注册实例注册工厂注册典型语法AddXXXT()AddXXXTService, TImplementation()AddXXX(obj)AddXXX(sp ...)注册内容类型信息已存在的对象实例对象创建方法Lambda对象何时创建获取服务时由容器创建注册前已创建获取服务时执行工厂函数创建谁决定如何创建对象容器屏幕前苦逼的你屏幕前苦逼的你容器是否负责创建✅❌部分负责容器是否管理生命周期✅✅✅是否支持依赖注入✅❌对象已创建✅是否可以获取容器中的其它服务自动注入❌✅通过sp.GetRequiredService()适用场景日常开发最常用已存在对象、第三方对象复杂初始化、特殊参数、条件创建常用程度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐WPF使用频率极高偶尔偶尔1类型注册容器负责创建类型注册有两种1.服务类型 注册类型// 服务类型 实现类型 AddXXX服务类型()这是WPF中最常用的注册方式services.AddSingleton产品(); services.AddTransient零件A(); // 等价于 services.AddSingleton产品, 产品(); services.AddTransient零件A, 零件A();2.服务类型 ≠ 注册类型AddXXX服务类型, 实现类型()有博客也叫这种方式为接口 / 基类注册// 接口注册 services.AddTransientILogger, FileLogger(); // 基类注册 services.AddSingleton零件Base, 零件A();2实例注册你先创建再交给容器实例注册主要针对于已经存在的对象直接使用存在的的实例❌容器不能使用已经存在的实例✔容器不会创建已经存在的实例实例已经创建完成因此容器不再负责创建# 类型注册使用容器注册产品 容器 ↓ new 产品() # # 实例注册将产品实例交给容器 new 产品() ↓ 容器代码示例SerialPort port new SerialPort(COM1, 115200); services.AddSingleton(port);3工厂注册你告诉容器以后怎么创建工厂注册实际上就是告诉容器不要使用默认的方法使用我提供给你的方法所以有其他博客说工厂注册的使用时机需要 复杂初始化需要配置参数根据条件创建对象时[!CAUTION]注册工厂时并不会立即执行 Lambda 表达式Lambda 只是被容器保存起来当获取服务调用服务时容器才会执行该 Lambda 来创建对象containerBuilder.AddSingleton零件A(); /// 这里是sp指IServiceProvider(当前容器) containerBuilder.AddSingleton产品(sp { // 现在这个大括号里面的内容就是你自定义的对象创建过程 var part sp.GetRequiredService零件A(); return new 产品(part); });获取产品 ↓ 执行工厂函数 ↓ 从容器获取零件A ↓ 创建并且返回产品3.构建容器BuildServiceProvider这个也不需要多讲但是有一个特别需要注意的地方[!IMPORTANT]BuildServiceProvider()会根据当前注册信息生成真正的 DI 容器换句话说前面的创建集合还并没有生成一个真正的DI容器在调用之前只有注册信息调用之后才能获取服务/* 三.生成容器 */ IServiceProvider container containerBuilder.BuildServiceProvider(); containerBuilder.MakeReadOnly(); // 将生成类集合声明为只读,后续再添加服务会进行报错 // containerBuilder.AddSingleton产品(); // 使用MakeReadOnly后报错4.获取服务GetService一般情况下我们会获取不带键的服务如下但是现在官方给了我们一种比较新的写法带键/* 四.服务调用(从容器获取对象) */ // 不带键 产品? product container.GetService产品(); 产品 product2 container.GetRequiredService产品();
RELATED

相关推荐

独立开发120天:我用Spring Boot+多模态AI做了个「反背单词」的学习App

独立开发120天:我用Spring Boot+多模态AI做了个「反背单词」的学习App

备案号:京ICP备2026040473号 | 体验地址:https://wordmate.cloud/写在前面 作为一个考了3次六级都没过500的Java开发,我背单词的历史就是一部「abandon」循环史:墨墨刷词刷到吐,不背单词的故事总是不符合语境&#xff…

📅 2026/11/3 23:44:46
CentOS 7/8 服务器重装:3种主流启动盘制作工具对比与Ventoy实战

CentOS 7/8 服务器重装:3种主流启动盘制作工具对比与Ventoy实战

CentOS 7/8 服务器重装:3种主流启动盘制作工具对比与Ventoy实战运维工程师最常遇到的场景之一就是服务器系统重装。无论是硬件更换、系统升级还是故障恢复,一个可靠的启动盘制作工具都能让整个流程事半功倍。本文将深入对比UltraISO、Rufus和Ventoy三款主…

📅 2026/9/23 3:12:04
LinkSwift:九大网盘直链解析神器,告别下载限速的智能解决方案

LinkSwift:九大网盘直链解析神器,告别下载限速的智能解决方案

LinkSwift:九大网盘直链解析神器,告别下载限速的智能解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…

📅 2026/9/2 4:53:29
MORE NEWS

更多资讯

📰

PostgreSQL查询阻塞诊断与优化实战指南

1. PostgreSQL查询阻塞问题概述在PostgreSQL数据库运维过程中,查询阻塞是最常见的性能瓶颈之一。当某个会话持有资源(如表锁、行锁)而另一个会话需要访问相同资源时,就会发生查询阻塞现象。这种情况在高并发业务场景中尤为常见&am…

📰

运维转行云原生工程师:技能迁移与学习路线

1. 运维转行背景与痛点分析从事Linux运维工作三年后,我最终选择了裸辞转行。这不是一时冲动,而是经过长期思考后的决定。作为过来人,我深知运维岗位的酸甜苦辣。下面我将详细剖析促使我做出这个决定的关键因素,相信很多同行都能从…

📰

MySQL数据库表约束设计实战与优化技巧

1. MySQL表约束的核心价值与应用场景数据库表约束是确保数据质量和业务规则完整性的关键机制。作为从业15年的数据库架构师,我见过太多因约束设计不当导致的数据灾难——从简单的用户注册重复到严重的财务数据不一致。约束本质上是对数据行为的预定义规则&#xff0…

📰

Prometheus告警规则模板库:从零搭建到生产调优实战

1. 为什么我坚持维护一套自己的告警规则模板库做运维和SRE这些年,我经手过的监控系统少说也有十几套了。每次新环境搭建、每次迁移、每次接手别人的集群,最耗时间的事情往往不是装Prometheus、不是配Grafana,而是告警规则到底该怎么写。装软件…

📰

M-PHY v5.0勘误解读:高速串行接口眼图与抖动测试定义

简介:MIPI M-PHY Specification v5.0 配套 PDF 面向移动端高速串行接口设计、验证与测试工程师,聚焦低引脚数、高带宽与优秀能效的物理层规范学习。压缩包仅含 1 个 PDF 文件,大小约 2.81MB,内容为 2022 年发布的 Errata 01 修订版…

📰

国内高效使用Claude Code AI编程助手的实践指南

1. 项目概述最近在开发者社区看到不少同行在讨论如何在国内环境下高效使用Claude Code这个AI编程助手。作为一个长期关注AI辅助编程工具的技术博主,我花了三周时间深入测试了Claude Code在国内网络环境下的完整使用方案。本文将分享从注册到实际编码的全套解决方案&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬