当前位置: 首页 > news >正文

ABP - 懒加载 [ILazyServiceProvider、DefaultLazyServiceProvider、LazyServiceProvider]

懒加载

对于 ABP 框架的懒加载机制,核心是围绕 ILazyServiceProvider 接口及其实现类展开的。作为新手,你可以简单理解为:它是 ABP 提供的“延迟获取服务的工具”,能让你在需要时才创建服务实例,而不是一开始就初始化所有依赖。

核心接口和类

  1. ILazyServiceProvider 接口(核心)
    定义了懒加载服务的基本操作,最常用的方法是:

    • LazyGetRequiredService<T>():获取必须存在的服务(服务未注册会抛异常),首次调用时才初始化。
    • LazyGetService<T>():获取可选服务(服务未注册返回 null)。
  2. DefaultLazyServiceProvider
    ILazyServiceProvider 的默认实现,内部基于 .NET 内置的 IServiceProvider 实现懒加载,不依赖 Autofac,是 ABP 默认容器的一部分。

  3. ApplicationService 基类中的 LazyServiceProvider 属性
    所有继承 ApplicationService 的类(如应用服务),可以直接通过 LazyServiceProvider 属性使用懒加载(已内置 ILazyServiceProvider 实例)。

一、先搞懂:什么是“懒加载”?

懒加载(Lazy Loading) 是一种“延迟初始化”技术:不到必须用的时候,绝不创建对象实例
举个生活例子:

  • 非懒加载:你出门时把所有可能用到的东西(雨伞、充电宝、书本)都塞进包里,不管当下用不用得上,背着很重。
  • 懒加载:出门时只带钥匙和手机,下雨了再回家拿雨伞,需要充电了再找充电宝——按需取用,更轻便。

在代码中,这意味着:如果一个服务(比如数据库连接、邮件发送器)初始化耗时/耗资源,但不是每次都用到,就可以用懒加载,避免“没用却先创建”的浪费。

二、ABP 为什么需要专门的懒加载工具?

ABP 是依赖注入(DI)框架,所有服务都由容器管理。但 .NET 内置的 IServiceProvider(默认容器)有个特点:调用 GetService<T>() 时会立即创建服务实例,没有“延迟创建”的能力。

比如:

// 非懒加载:调用 GetService 时,EmailService 会立即被创建
var emailService = serviceProvider.GetService<IEmailService>(); 

如果 EmailService 初始化很耗时,但后续可能用不上,就会造成浪费。因此 ABP 封装了一套懒加载工具,解决这个问题。

三、ABP 懒加载的核心组件

ABP 提供了 3 个核心组件,从“定义规则”到“具体实现”再到“便捷使用”:

组件 作用
ILazyServiceProvider 接口 定义“懒加载服务”的规则(比如“如何延迟获取服务”),是“契约”。
DefaultLazyServiceProvider 实现 ILazyServiceProvider 接口,是实际干活的“工具人”。
ApplicationService 基类的 LazyServiceProvider 属性 给应用服务层提供的“快捷入口”,不用手动注入就能用懒加载。

1. ILazyServiceProvider 接口(规则定义)

它就像一份“说明书”,规定了懒加载必须支持哪些操作。核心方法有两个:

public interface ILazyServiceProvider
{// 1. 获取“必须存在”的服务(服务没注册会抛异常),首次用才创建实例T LazyGetRequiredService<T>();// 2. 获取“可选”服务(服务没注册返回 null),首次用才创建实例T? LazyGetService<T>();
}
  • LazyGetRequiredService<T>():适合“必须有这个服务”的场景(比如订单服务必须依赖支付服务)。
  • LazyGetService<T>():适合“可有可无”的场景(比如日志服务,没注册就不打日志)。

2. DefaultLazyServiceProvider 类(实际实现)

这是 ILazyServiceProvider 的“打工人”,内部通过 .NET 内置的 IServiceProvider 实现延迟加载。
它的工作原理很简单:

  • 当你调用 LazyGetRequiredService<T>() 时,它先不创建服务实例,而是“记住”要创建的服务类型 T
  • 直到你真正使用这个服务时(比如调用服务的方法),它才通过 IServiceProvider 去创建实例。

(注:它不依赖 Autofac,完全基于 .NET 原生 DI,所以 ABP 默认就能用。)

3. ApplicationService 中的 LazyServiceProvider 属性(便捷使用)

ABP 的 ApplicationService 基类(应用服务的父类)已经帮你注入了 ILazyServiceProvider,并通过 LazyServiceProvider 属性暴露出来。
也就是说:只要你的类继承了 ApplicationService,就能直接用 LazyServiceProvider 调用懒加载方法,不用自己写构造函数注入。

四、实战:从 0 到 1 用起来

我们用一个完整场景演示:用户注册时,可选“发送欢迎邮件”,邮件服务初始化耗时,适合懒加载。

步骤 1:定义需要懒加载的服务(邮件服务)

// 邮件服务接口
public interface IEmailService
{void SendWelcomeEmail(string username);
}// 邮件服务实现(假设初始化很耗时)
public class EmailService : IEmailService, ITransientDependency
{public EmailService(){// 模拟耗时的初始化(比如连接邮件服务器)Console.WriteLine("【EmailService 初始化】:连接邮件服务器...(耗时 2 秒)");Thread.Sleep(2000); // 暂停 2 秒,模拟耗时}public void SendWelcomeEmail(string username){Console.WriteLine($"【发送邮件】:欢迎 {username} 注册成功!");}
}
  • IEmailService:邮件服务的接口。
  • EmailService:实现类,标记为 ITransientDependency(ABP 会自动注册为瞬态服务)。
  • 构造函数中的 Thread.Sleep(2000) 模拟初始化耗时,方便我们观察懒加载效果。

步骤 2:在应用服务中使用懒加载

创建一个用户注册服务,其中一个方法需要发送邮件,另一个不需要:

// 继承 ApplicationService,直接使用 LazyServiceProvider 属性
public class UserRegistrationAppService : ApplicationService
{// 方法 1:快速注册(不发邮件)public void QuickRegister(string username){Console.WriteLine($"【用户注册】:{username} 快速注册成功(不发邮件)");// 注意:这里没有用到 EmailService,所以它不会被初始化}// 方法 2:完整注册(发邮件,需要懒加载 EmailService)public void FullRegister(string username){Console.WriteLine($"【用户注册】:{username} 完整注册成功(准备发邮件)");// 关键:用懒加载获取 EmailService(此时还没初始化)var emailService = LazyServiceProvider.LazyGetRequiredService<IEmailService>();Console.WriteLine("【准备调用邮件服务】:即将发送邮件...");// 只有当调用 emailService 的方法时,EmailService 才会真正初始化emailService.SendWelcomeEmail(username);}
}

步骤 3:测试效果(观察初始化时机)

假设我们在 ABP 项目中调用这两个方法,输出如下:

// 模拟 ABP 容器获取服务(实际项目中由 ABP 自动处理)
var userService = serviceProvider.GetRequiredService<UserRegistrationAppService>();// 调用 QuickRegister(不发邮件)
userService.QuickRegister("张三"); 
// 输出:
// 【用户注册】:张三 快速注册成功(不发邮件)
// (EmailService 从未被初始化,因为没用到)// 调用 FullRegister(发邮件)
userService.FullRegister("李四"); 
// 输出:
// 【用户注册】:李四 完整注册成功(准备发邮件)
// 【准备调用邮件服务】:即将发送邮件...
// 【EmailService 初始化】:连接邮件服务器...(耗时 2 秒)  <-- 此时才初始化
// 【发送邮件】:欢迎 李四 注册成功!

关键结论

  • EmailService 只在 FullRegister 方法中真正使用时才初始化,QuickRegister 中完全不初始化,实现了“按需加载”。

五、懒加载的常见疑问

  1. 和直接注入 Lazy<T> 有什么区别?
    .NET 原生也支持注入 Lazy<T>(比如 public MyService(Lazy<IEmailService> emailService)),但 ABP 的 ILazyServiceProvider 是更贴合框架的封装,尤其是在 ApplicationService 中可以直接用 LazyServiceProvider,不用手动注入 Lazy<T>

  2. 什么时候必须用懒加载?

    • 服务初始化耗时/耗资源(如数据库连接、远程服务客户端)。
    • 服务可能不被使用(如可选功能)。
    • 避免循环依赖(A 依赖 B,B 依赖 A 时,直接注入会报错,懒加载可缓解)。
  3. 懒加载会影响性能吗?
    不会,反而能提升性能——因为它避免了不必要的初始化。只有当服务确实被使用时,才会付出初始化成本。

六、总结

ABP 的懒加载核心就是:

  1. 通过 ILazyServiceProvider 接口定义“延迟获取服务”的规则。
  2. 通过 DefaultLazyServiceProvider 类基于 .NET 原生 DI 实现这个规则。
  3. ApplicationService 中通过 LazyServiceProvider 属性直接使用,简化代码。

用法上,记住一句话:继承 ApplicationService 后,用 LazyServiceProvider.LazyGetRequiredService<T>() 获取服务,它会在你第一次用这个服务时才初始化

http://www.zskr.cn/news/30135.html

相关文章:

  • 2025年铁氟龙高温线厂家权威推荐榜:极细铁氟龙/UL10064铁氟龙/UL1332铁氟龙/UL1867铁氟龙/UL10064极细铁氟龙/UL1332极细铁氟龙/UL1867极细铁氟龙专业供应商
  • 2025年提升机厂家权威推荐榜:自动提升机专业选购指南,高效稳定与安全性能深度解析
  • 2025年冷水机/冷冻机/冰水机厂家权威推荐榜:工业制冷设备实力解析与高效节能口碑之选
  • netcore vue grpc、http grpc
  • Go 的跨平台编译详解 - 指南
  • 完整教程:三维计算机视觉:从2D图像到3D理解的跨越
  • 爬虫逆向——RPC技术 - 教程
  • 兼职帮农业公司搭建外贸出海网站(赚了900元)
  • 完整教程:营销驱动式增长(MLG)是什么?解析模式、策略与实践案例
  • 2025 年载冷剂厂家推荐排行榜:无醇/安全型/SH-4/SH-5A/多元醇/高低温/超低温/乙二醇/冷库专用/食品级载冷剂公司推荐
  • [网络] [TCP] 使用py脚本简单实现tcp通信发送/储存文件
  • kali wsl桌面使用
  • 模拟赛 R18
  • 2025年盐趣科研教育深度解析:从“科研背景”维度拆解留学突围路径
  • 2025 年最新推荐装修公司优质品牌排行榜:聚焦环保与工艺,口碑装修公司权威甄选
  • 2025 年最新推荐 WMS 服务商综合实力排行榜:涵盖智能仓储管理系统品牌核心技术优势及协会权威测评结果
  • 告别“求推荐”的迷茫,如何挑选一家真正专业的直播源码定制开发公司?
  • 2025 年最新推荐小程序开发公司排行榜:含定制开发 / 电商 / 预订服务 / 活动报名 / 配送解决方案
  • Visual Studio Code 的 AI 插件汇总 - 指南
  • 2025 年独立游戏公司AI 美术设计平台最新推荐榜,技术实力与服务体验双重维度深度测评
  • 详细介绍:JavaScript学习笔记(十七):ES6生成器函数详解
  • 如何构建高效 AI 智能体 - 详解
  • 面对大学里琳琅满目的证书考试,你的该问题非常关键——在有限的时间和精力下,做出最有价值的选择
  • 安卓画布学习手册-全-
  • 2025 年最新推荐五莲花花岗岩优质厂家榜单:顶尖厂家综合实力测评与选购指南
  • 安卓设计模式最佳实践-全-
  • VS-和-CrystalReport-报告指南-全-
  • Paper: Accelerating Vision Transformers with Adaptive Patch Sizes
  • 2025年实用金属铝合金打包机厂家推荐榜单:多场景适配的优质之选
  • 2025年高压加速老化试验箱厂家推荐排行榜,HAAS试验箱,环境应力筛选,可靠性测试设备公司精选