后端自定义代码开发规范
不能使用过时的类或方法
说明:使用 Obsolete 标识的方法为过时方法。C# 中标记过时的方法可能在新版本 .NET Framework 或官方接口中被移除,因此禁止使用此类或方法。
使用常量或确定有值的对象调用 Equals
Object 的 Equals 方法易引发空引用异常,应使用常量或确定有值的对象调用 Equals。
// 反例:
user.Equals("Jack");
// 推荐写法
"Jack".Equals(user);
减少循环内 Engine 接口调用
减少服务间通信次数:跨进程接口调用的耗时与 CPU 消耗约为普通接口调用的 10000 倍。如需多次调用,应改用批量接口。
// 批量提交示例
H3.DataModel.BulkCommit commit = new H3.DataModel.BulkCommit();
H3.DataModel.BizObjectSchema schema = this.Request.Engine.BizObjectManager.GetPublishedSchema("D0001001");
for(int i = 0; i < 1000; i++) {
H3.DataModel.BizObject obj = new H3.DataModel.BizObject(this.Request.Engine, schema, this.Request.UserContext.UserId);
obj["F000001"] = 1;
obj.Create(commit); // 若对象已存在,仅需执行 Update:obj.Update(commit);
}
string errorMsg = null;
commit.Commit(this.Request.Engine.BizObjectManager, out errorMsg);
代码中禁止使用反射
GetType().Get*() 方法仅支持单线程执行。在并发环境中使用此类代码无法发挥多 CPU 线程优势。反射执行速度约为普通代码的 1/10。
禁止数据库 DDL 操作
DDL(Data Definition Language)操作用于定义和管理数据库结构,包括创建(CREATE)、删除(DROP)、修改(ALTER)数据库和表等。
禁止大数据量数据库操作
禁止一次性读取或操作上千条数据。
禁止循环调用数据库操作
禁止通过 SQL 直接操作业务数据
禁止通过 SQL 直接对数据库业务数据进行增删改操作,应通过接口操作。SQL 操作仅更新当前字段值,无法触发计算规则、自动化及业务规则,存在数据不一致风险。
乐观锁机制
为提高系统性能并减少锁冲突,氚云采用乐观锁机制。新增/编辑提交时出现以下提示报错,应优先排查乐观锁冲突:
保存失败:UpdateFailed保存失败:ItemExistsOptimistic lock failed, the object has been updated by other user
需检查自定义代码逻辑,常见错误场景包括:
- 在
base.OnSubmit前调用this.Request.BizObject.Update() - 在
base.OnSubmit前调用this.Request.Engine.WorkflowInstanceManager.SendMessage激活当前流程 - 在
base.OnSubmit前通过自定义接口更新当前提交数据 - 在
base.OnSubmit前更新或新增子表数据
⚠️ 注意
提交时应仅修改数据对象,避免执行提交操作。若自定义代码需多次更新当前提交数据,应在每次更新前重新Load数据对象。
// 正确示例:更新前重新加载对象
var reloadedObj = this.Request.Engine.BizObjectManager.GetBizObject(schema, objId);
reloadedObj["Field"] = newValue;
reloadedObj.Update();