You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么IContext.RetractLinked需要两个参数,不能仅用key删除?

为什么RetractLinked需要同时传入key和record

  • 精准操作约束:linked fact的key仅为逻辑分组标识,框架原生支持同一个key绑定多个fact实例。如果仅通过key执行删除,会直接清空该key下关联的所有事实,不符合绝大多数场景下只删除指定实例的需求,从API设计层面避免误删操作。
  • 并发一致性校验:当多规则、多线程同时操作同一个key下的事实时,框架会自动比对你传入的record和当前上下文该key下实际绑定的record是否匹配,仅匹配时才会执行删除,避免基于旧状态操作时误删其他逻辑刚插入的新事实,保证上下文数据一致性。
  • 规则生命周期调度要求:规则引擎需要基于具体的fact实例触发后续的规则重匹配、依赖链更新、关联事件回调等逻辑,仅提供key的话框架无法定位到需要移除的具体事实,无法完成完整的生命周期调度。

未持有record时的删除方案

无需提前持有对应record,可直接通过key查询到关联的事实实例后再执行删除操作即可:

// 先通过key查询对应绑定的fact
var longOrder = context.GetLinked<LongOrder>(longOrderKey);
// 校验非空后执行移除
if (longOrder != null)
{
    context.RetractLinked(longOrderKey, longOrder);
}

如果业务逻辑可以确定同一个key下永远只会绑定一个fact,该查询操作的开销极低,几乎不会对性能产生影响。如果需要删除同一个key下的所有关联fact,遍历context.GetLinked<LongOrder>(longOrderKey)返回的所有结果挨个删除即可。

内容的提问来源于stack exchange,提问作者user365462

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:09:03