跳转至

后端自定义代码开发规范

不能使用过时的类或方法

说明:使用 Obsolete 标识的方法为过时方法。C# 中标记过时的方法可能在新版本 .NET Framework 或官方接口中被移除,因此禁止使用此类或方法。

使用常量或确定有值的对象调用 Equals

ObjectEquals 方法易引发空引用异常,应使用常量或确定有值的对象调用 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
  • 保存失败:ItemExists
  • Optimistic 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();