2014-03-03 55 views
1

我正在尝试在同一个插件的不同调用之间使用IPluginExecutionContext的SharedVariable。我有以下情况:CRM 2011插件中的共享变量

用户正试图创建一个新的实体记录,并且插件已在Pre阶段触发。基于一些逻辑,我设置一个SharedVariable像这样:

var context = (IPluginExecutionContext) serviceProvider.GetService(typeof (IPluginExecutionContext)); 
context.SharedVariables.Add("MySharedVariable", true); 

我然后尝试更新其他记录同一实体的,像这样:

var qe = new QueryExpression("new_myentity"); 
qe.Criteria.AddCondition("ecs_myfield", ConditionOperator.Equal,"someValue"); 
var results = service.RetrieveMultiple(qe); 

foreach (var foo in results.Entities) 
{ 
    //Do something to foo 
    service.Update(foo); 
} 

我也有注册的插件但是,在Pre阶段更新,我想检查MySharedVariable并根据是否设置来做其他事情。

在更新中,上下文不包含'MySharedVariable'的键。我通过使用ITracingService证实了这一点。

在不同记录上运行的插件之间传递共享变量是否存在一些限制?

的插件运行模式同时创建和更新设置为同步和已经说明,无论是登记在预操作阶段

回答

4

我不使用SharedVariables经常,但我敢肯定,他们是在相同的执行上下文中可用(例如,从同一个记录上的同一个消息的Pre事件到Post事件)。

它们不能用于在不同记录上的不同消息上的不同插件之间共享值(如您的情况:在一条记录的创建中设置值并检索另一条记录的更新消息内的值)

对于您的情况,我认为最好使用自定义实体来存储值或为实体创建附加属性。

+1

什么是围绕SharedVariables沿的背景下通过的规则?我认为他们像交易一样被传递,所以无论你的插件触发什么插件,他们都会被传递,这是不正确的? – Daryl

+0

我觉得只有一批测试用常见的场景才能说明这一点:) –

+2

什么?!?!?你的意思是你没有无限的时间做测试,我没有时间去做? :) – Daryl