为什么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
相关产品推荐
相关产品推荐

