如何知道哪个插件/工作流/实体更新数据

时间:2012-12-04 03:13:54

标签: c# .net dynamics-crm-2011 dynamics-crm

在我的插件中,我有一个代码来检查执行上下文深度以避免无限循环一旦插件更新自身/实体,但有些情况下实体正在从深度为2,3或4的其他插件或工作流程进行更新对于那些特定的调用,我想要处理该特定的插件,即使深度大于1,也不会停止。

2 个答案:

答案 0 :(得分:2)

也许不同的方法可能更好?我从来不需要在插件中考虑Depth。我听说过其他人和你做同样的事情(检查深度以避免代码运行两次或更多)但我通常通过在Pre Operation阶段对底层实体进行任何更改来避免这种情况。

例如,如果我有更新机会时更改机会名称的代码,通过将我的代码置于更新的后期操作阶段,我的代码会对用户通过发送更改值做出反应将Update请求分离回平台以应用更改。这个新的Update本身会导致我的插件再次触发 - 无限循环。

如果我将我的逻辑置于操作前阶段,我会采用不同的方式:用户的更改会触发插件。在将用户的更改提交到平台之前,将调用我的代码。这次我可以查看Target中发送到InputParameters消息的Update。如果name中不存在Target属性(即它未更新),那么我可以将具有所需值的名为name的属性附加到Target并且这个值将被传递到平台。换句话说,我在提交之前将我的值注入记录,从而避免了发出另一个Update请求的需要。因此,我的更改不会导致其他插件触发。

显然,我认为你的情景更复杂,但如果它不符合相同的模式,我会感到非常惊讶。

答案 1 :(得分:0)

我首先会同意Greg上面所说的一切 - 如果可能的话,重构设计以避免这种情况。

如果无法做到这一点,您需要使用IPluginExecutionContext.SharedVariables在插件之间进行通信。

在插件开头检查SharedVariable,然后根据需要设置/更新它。您将使用的具体设计将根据您需要管理的复杂程度而有所不同。我总是使用带有消息和实体ID的字符串 - 很容易序列化和反序列化。然后我总是知道我是否已经针对特定记录针对特定消息执行了。