Apex 与 .NET 基础:从 C# 迁移到 Salesforce 平台

面向 .NET 开发者的 Apex 入门:把熟悉的 C# 概念映射到 Salesforce 平台。本文系统对比 Apex 与 .NET 的异同(OOP、数据类型、集合、与数据库的紧密耦合、批量处理、75% 测试覆盖率),讲解执行上下文与 governor limits、触发器要点与批量安全、异步 Apex(Future/Queueable/Batch/Scheduled),以及用调试日志、Log Inspector 和检查点诊断代码,帮助 .NET 开发者快速上手 Salesforce 开发。...

📅 2026/10/5 ✍️ ponybai 🏷️ salesforce, developer, apex, dotnet, headless

一、将 .NET 概念映射到 Salesforce 平台

本单元为 .NET 开发者而设:把熟悉的 C# 概念映射到 Salesforce 平台。你将理解 Lightning 平台与 Apex 语言的关键特性,识别 .NET 与 Lightning 平台的异同,并用 Developer Console 创建第一个 Apex 类、用 Anonymous Apex 调用方法。

认识 Lightning 平台与 Apex 基础

slide_2

对 .NET 开发者来说,可以把 Lightning 平台想成一个运行在云端的、专为 Salesforce 定制的 .NET Framework。它有三个关键特性:多租户(multitenant)——共享基础设施、受 governor limits 约束;元数据驱动(metadata-driven)——配置即数据;云原生(cloud-native)——无需管理服务器。

Apex 就是 Salesforce 平台上的「C#」——在 Salesforce 服务器上保存、编译、执行。它是面向对象的(类、接口、继承)、强类型的(编译期校验)、与数据库深度集成(sObject、SOQL、DML),并内置测试框架。你写代码、保存到云端,它就在 Salesforce 服务器上运行——没有 IIS、没有部署流水线、没有服务器配置,写完即可运行。

相似之处:OOP、数据类型、集合

slide_3

好消息是:你熟悉的面向对象概念(类、接口、继承、多态)在 Apex 中完全一样。数据类型几乎一一对应:int → Integer、string → String、bool → Boolean、double/decimal → Double/Decimal、DateTime → Datetime。

集合遵循同样的模式:List<T> → List<T>(同概念)、HashSet<T> → Set<T>(无序、唯一)、Dictionary<K,V> → Map<K,V>(键值对)。主要语法差异:方法名小写(add 而非 Add)、字符串用单引号、处处需要分号。核心概念相同,很快就能适应。

不同之处:平台特性

slide_4

最大的思维转变:Apex 不是通用语言,它是为多租户平台上的业务逻辑而生的。关键差异:

  • Apex 与数据库紧密耦合——没有 Entity Framework、没有 ADO.NET、没有 ORM。记录天然就是 sObject,SOQL 直接内嵌在代码里,DML 语句取代 SQL 的 INSERT/UPDATE/DELETE。
  • 不同的设计模式——批量安全处理是强制的。始终操作 List,绝不单条记录。触发器一次可接收 200 条记录。
  • 单元测试是必需的——生产部署要求 75% 代码覆盖率。不是可选、不是最佳实践,而是必需。
  • 没有 solution/project/config 文件——没有 .sln、.csproj、web.config、appsettings.json。元数据即配置。
  • 更小的类库——没有 LINQ、泛型受限、没有 async/await。
  • 开发工具——浏览器版 Developer Console,或 VS Code + Salesforce Extensions,没有 Visual Studio/ReSharper。

集成与动手实践

slide_5

集成用 HttpRequest/HttpResponse(比 HttpClient 简单但模式类似),Remote Site Settings 是安全白名单。创建 Apex 类:Developer Console → File → New → Apex Class → 写类 → 保存(自动编译)→ 在 Problems 标签修编译错误 → 用 Anonymous Apex 或触发器测试。

Anonymous Apex 就像 C# Interactive 或 LINQPad——直接写代码立即执行,无需创建完整应用。没有 Main() 方法、没有 Program.cs,类由触发器、控制器或其他 Apex 代码调用。.NET 知识可以迁移,平台差异需要适应,但学习曲线以「天」计,而非「周」。

二、理解执行上下文

slide_6

第二单元理解执行上下文——Apex 代码运行的环境和限制,触发器如何工作,governor limits 是什么,以及为什么批量处理至关重要。

什么是执行上下文?

slide_7

执行上下文(Execution Context)是 Apex 代码执行的环境和限制。Apex 的调用方式:触发器(DML 操作)、Anonymous Apex(Developer Console)、Batch/Queueable/Scheduled 作业、REST/SOAP web 服务、Lightning Web Components(@wire/命令式)、Visualforce 控制器、邮件处理器。每次调用都创建一个全新的执行上下文和全新的 governor limits。

关键 governor limits:100 个 SOQL 查询(异步 200)、150 条 DML 语句、SOQL 检索 50000 条记录、DML 处理 10000 条记录、6 MB 堆大小(异步 12 MB)。限制在每个上下文内重置,一旦触限就抛运行时异常。这也是批量处理如此重要的原因:一次查询 200 条记录用 1 个 SOQL limit,200 次各查 1 条则直接触限。

触发器要点与批量处理

slide_8

触发器类型:before insert/update/delete(保存前修改记录)、after insert/update/delete(访问系统字段如 Id、修改相关记录)、after undelete。Before 触发器用于在保存前更新或校验记录值;After 触发器用于访问系统设置字段并影响其他记录。

批量处理是强制要求:触发器一次可接收多达 200 条记录,你的代码必须能处理 1 条也能处理 200 条。错误的做法是 Account a = Trigger.new[0](假设单条记录);正确做法是 for (Account a : Trigger.new) { ... }(处理任意数量)。用 Trigger.new(列表)而非 Trigger.new[0],用 Map 做高效查找,绝不在循环里放 SOQL/DML。批量安全 = 生产安全。

三、使用异步 Apex

slide_9

第三单元学习异步 Apex——future 方法、Queueable、Batch、Scheduled——用于不该同步运行的长时任务。

何时异步:Future 与 Queueable

slide_10

何时走异步:发起外部 callout(尤其从触发器)、处理大量数据(数千条以上)、可能触同步 governor limits 的操作、长时计算、可以稍后再跑的操作。

Future 方法是最简单的异步模式:加 @Future 注解,方法必须 static、返回 void、参数只能是基本类型。局限:无法跟踪执行(不返回 job ID)、参数必须基本类型、不能链式调用。不能有执行顺序保证。

Queueable Apex 是 Future 的现代替代:实现 Queueable 接口,用 System.enqueueJob() 提交。优点:支持非基本类型、返回 job ID 用于监控、支持作业链式调用。新开发优先用 Queueable。

Batch 与 Scheduled Apex

slide_11

Batch Apex 分块处理数百万条记录:实现 Database.Batchable 接口(start()/execute()/finish()),用 Database.executeBatch() 执行。每个 chunk(默认 200 条)获得全新的 governor limits。

Scheduled Apex 在指定时间运行:实现 Schedulable 接口,用 System.schedule() 加 CRON 表达式调度。经典模式:Scheduled → Batch——定时任务凌晨 2 点触发 Batch 作业处理前一天的数据。

异步限制:每个事务 50 个 future/queueable、最多 5 个 batch 作业同时排队/激活、最多 100 个 scheduled 作业。选择合适的异步工具。

四、调试与运行诊断

slide_12

最后一个单元掌握 Apex 调试:调试日志、Log Inspector 和检查点,用于追踪代码执行、诊断问题。

调试日志与 Log Inspector

slide_13

调试日志(Debug Log)是主要的诊断工具,记录 Apex 执行期间发生的一切。用 System.debug() 输出值,在 Developer Console 查看日志。Log Inspector 提供可视化分析:按事件类型过滤(SOQL、DML、USER_DEBUG)、查看执行时间线、识别性能瓶颈、跟踪 governor limit 消耗。

日志显示的内容:代码执行(方法调用、行号)、SOQL 查询(查询文本、行数、耗时)、DML 操作(类型、影响记录数)、governor limit 使用(已用/允许)、异常(类型、消息、堆栈跟踪)。日志就是真相——代码行为异常时,日志会准确告诉你发生了什么。

设置检查点

slide_14

检查点(Checkpoint)在 Apex 代码执行的特定位置捕获变量状态:在 Developer Console 打开 Apex 类 → 点击行号设置检查点 → 触发代码执行 → 查看结果(该点的变量值、堆大小、governor limit 消耗)。

检查点 ≠ .NET 断点:不能逐步执行代码,捕获的是快照而非交互式调试,且可在生产环境工作(不仅开发环境),但有限制(最多 5 个活动检查点)。检查点 + 调试日志 = 完整诊断图景:日志显示发生了什么,检查点显示发生时的状态。


文章来源:Trailhead - Apex & .NET Basics