2014-03-03 57 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