ABP 依赖注入源码解读:约定注册器是如何自动扫描和注册服务的

发布时间:2026/9/20 4:06:33

ABP 依赖注入源码解读:约定注册器是如何自动扫描和注册服务的 传统 vs ABP传统方式services.AddScopedIUserService,UserService();services.AddTransientIEmailService,EmailService();ABP 方式publicclassUserService:IUserService,ITransientDependency{}背后的原理是什么直接看DefaultConventionalRegistrar.cs源码。源码位置framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs约定注册的核心流程publicoverridevoidAddType(IServiceCollectionservices,Typetype){// 1. 检查是否禁用了约定注册if(IsConventionalRegistrationDisabled(type))return;// 2. 获取生命周期vardependencyAttributeGetDependencyAttributeOrNull(type);varlifeTimeGetLifeTimeOrNull(type,dependencyAttribute);if(lifeTimenull)return;// 没实现标记接口不注册// 3. 获取暴露的服务类型注册为哪个接口varexposedServiceAndKeyedServiceTypesGetExposedKeyedServiceTypes(type).Concat(GetExposedServiceTypes(type).Select(tnewServiceIdentifier(t))).ToList();// 4. 触发暴露事件其他模块可以修改TriggerServiceExposing(services,type,exposedServiceAndKeyedServiceTypes);// 5. 逐一添加到 DI 容器foreach(varexposedServiceTypeinexposedServiceAndKeyedServiceTypes){varserviceDescriptorCreateServiceDescriptor(type,...,lifeTime);services.Add(serviceDescriptor);}}第一步生命周期判定GetLifeTimeOrNull的优先级protectedvirtualServiceLifetime?GetLifeTimeOrNull(Typetype,DependencyAttribute?dependencyAttribute){returndependencyAttribute?.Lifetime// 1. [Dependency] 属性指定??GetServiceLifetimeFromClassHierarchy(type)// 2. 标记接口??GetDefaultLifeTimeOrNull(type);// 3. 默认值null 不注册}GetServiceLifetimeFromClassHierarchy检查类的继承链if(typeof(ITransientDependency).IsAssignableFrom(type))returnServiceLifetime.Transient;if(typeof(ISingletonDependency).IsAssignableFrom(type))returnServiceLifetime.Singleton;if(typeof(IScopedDependency).IsAssignableFrom(type))returnServiceLifetime.Scoped;三个标记接口都是空接口没有任何方法纯标记用途publicinterfaceITransientDependency{}// 空接口publicinterfaceISingletonDependency{}// 空接口publicinterfaceIScopedDependency{}// 空接口第二步暴露服务类型判定ExposedServiceExplorer.GetExposedServices的默认逻辑// 1. 有 [ExposeServices] → 用属性指定的类型// 2. 没有 → 按约定推断// 遍历类实现的所有接口// 接口名去掉 I 前缀剩下的跟类名比较// 如果类名以它结尾不区分大小写则匹配比如publicclassProductService:IProductService,ITransientDependency// IProductService → 去掉 I → ProductService → 类名 ProductService 以 ProductService 结尾 → 匹配// 相当于 [ExposeServices(typeof(IProductService))]第三步ServiceDesciptor 注册最后调用services.Add(serviceDescriptor)但还有两个变体if(dependencyAttribute?.ReplaceServicestrue)services.Replace(serviceDescriptor);// 替换已有注册elseif(dependencyAttribute?.TryRegistertrue)services.TryAdd(serviceDescriptor);// 不存在时才注册elseservices.Add(serviceDescriptor);// 默认直接注册启动时扫描谁ABP 启动时每个模块的ConfigureServices阶段会调用context.Services.AddAssemblyOfTModule();这个方法扫描当前模块所在程序集的所有公开类型对每个类型执行DefaultConventionalRegistrar.AddType。所以一个类只要在模块的程序集中、实现了标记接口就会被自动注册。实战如何排查注册问题如果发现IServiceProvider.GetServiceT()返回 null按这个顺序排查检查类是否在模块的程序集中在哪个项目那个项目被引用了检查类是否实现了标记接口ITransientDependency/ISingletonDependency/IScopedDependency检查是否写了[DisableConventionalRegistration]检查生命周期选择是否正确对比总结// 方式 1标记接口最常用publicclassMyService:ITransientDependency{}// 方式 2标记接口 显示的暴露接口[ExposeServices(typeof(IUserService))]publicclassUserService:IUserService,ITransientDependency{}// 方式 3[Dependency] 精细控制[Dependency(ReplaceServicestrue)]publicclassMockService:IRealService,ITransientDependency{}// 方式 4禁用自动注册手动管理[DisableConventionalRegistration]publicclassHelperService{}// 需要手动 services.AddSingletonHelperService()
延伸阅读

更多相关文章

2026/9/20 4:06:33

2026年毕业生黑科技榜单9款AI论文写作软件实测!

前言:AI 写论文乱象频发,实测 8 款工具理清适配边界 每到毕业季,本科生、硕博生都会扎堆寻找 AI 论文辅助工具,市面上各类写作软件层出不穷,但普遍存在几类硬伤:虚假参考文献、无法匹配本校格式、不支持公式…

2026/9/20 4:06:39

4英寸720x720高PPI方形LCD驱动全解析:从硬件选型到软件实战

1. 项目概述:一块“非主流”方形高分辨率屏幕的深度探索最近在捣鼓一个桌面小摆件项目,想找一块显示效果细腻、尺寸又足够小巧的屏幕。市面上常见的3.5寸、5寸屏大多是480x320或800x480的分辨率,颗粒感在所难免。直到我发现了“4inch 720x720…

2026/9/20 4:06:39

ESP8266 AT命令无响应排查与WiFi模块开发实战指南

第一次拿到 ESP8266 模块时,我把它插上 USB 转串口线,打开串口调试助手,敲下AT然后期待地按下回车——结果什么反应都没有。屏幕上一片空白,模块上的蓝色指示灯安静地亮着,仿佛在嘲笑我的无知。这不是一个简单的“串口…

2026/9/21 3:07:33

Ollama+DeepSeek+Dify本地化部署:打造私有AI工作站实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:07:33

研发质量控制步骤详解:从需求评审到发布复盘的全流程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:07:33

餐饮管理集团制度汇编实操:从框架设计到落地执行全拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:07:33

R语言镜像源配置全指南:清华/阿里云加速安装

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:07:33

GATB能力倾向测验指南:从9大因子到职业匹配的完整解读

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/21 0:02:23

OpenResearch:构建可复现的开放式研究工作流

第一次看到“OpenResearch”这个名字,我脑子里冒出的不是某个具体软件,而更像一种研究方式的宣言:开放、可复现、可验证。这三件事放在一起,其实比大多数人想象中难得多。过去几年我一直在折腾自己的研究工作流,从纯纸…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/20 5:09:33

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码