2014-04-28 98 views
1

參數我們從IPlugin繼承構建在Microsoft Dynamics CRM的一些插件。我們配置了這些配置,以便在更新Account時觸發它們。的Microsoft Dynamics CRM - 通行證從Web服務到IPlugins

的問題是插件在呼喚我們的服務,使我們的服務與更新響應。我們現在正在做一些非常黑客的事情,以防止這些週期性更新發生。

如果有一種方式來傳遞一個值IOrganizationService服務(Web服務),一個插件可以看看我們想知道。我們的其他系統可以發送一個標誌(「嘿,不要發送更新!」),該插件可以跳過回調。

我們可以將參數從web服務傳遞給插件嗎?

回答

0

我們決定正確的解決方案是使用在IPluginExecutionContext.InputParameters["Target"]找到的值。如果是Update,則返回包含所有已更新屬性的屬性的Entity

我們基本上有一個我們關心的屬性名稱列表。我們通過名稱循環查看它們是否出現在實體屬性列表中。如果是這樣,我們會向我們的其他系統發送更新。好消息是,Dynamics CRM會忽略實際上並未更改值的更新,因此嘗試將值更新爲自身是無操作的。

public void Execute(IServiceProvider serviceProvider) 
{ 
    IPluginExecutionContext context = serviceProvider.GetService(typeof(IPluginExecutionContext)); 
    Entity entity = (Entity)context.InputParameters["Target"]; 
    string[] fields = new string[] { "name", "statecode", "address1_line1" }; 
    bool hasUpdates = fields.Where(f => entity.Attributes.Contains(f)).Any(); 
    if (!hasUpdates) 
    { 
     return; 
    } 
} 
0

好主意可以使用自定義標誌字段。例如,您添加位域並將其稱爲CallFromExternalSystem。所以當你通過IOranizationService從外部系統進行更新時,你只需要用真正的字段來填充這個標誌,並且在插件中你可以檢查這個字段是否出現在字段列表中,這樣你就不需要再次調用外部系統端點。

+0

我們考慮過每當向服務發送更新時,我們都會設置一個GUID字段。不幸的是,這不適用於'SetState'和'Assign'請求。 –

+0

在這種情況下 - 您應該定義一些用戶帳戶(並且可以使用啓動帳戶調用的插件)。如果通話已完成,則表示該呼叫是從外部系統完成的。 –

+0

和(如果尚未完成)爲每個更新步驟設置過濾屬性。如果外部系統和插件不會更新相同的字段,那麼這應該足夠了。如果他們更新相同的字段,您可以查看上下文深度以防止無限遞歸(我不得不承認)。恕我直言,所有其他選項已由@ andrii-butenko(使用標誌/不同的呼叫用戶) – salyh

相關問題