Plug-in’y w Microsoft Dynamics CRM 4.0 działają zawsze w określonym kontekście. Ten kontekst prawie zawsze obsługuje parametry wejściowe i wyjściowe (lub opcjonalne). I ten post jest właśnie o tych parametrach :).
Bardzo często zdarza się, że z przyzwyczajenia lub po skopiowaniu kodu z SDK 😉 rozpoczynamy pracę z naszym plug-in’em od napisania (wklejenia) następującej linijki:

if(context.InputParameters.Properties.Contains("Target") &&
   context.InputParameters.Properties["Target"] is DynamicEntity)

Później np. przy plug-in’ie obsługującym usuwanie dziwimy się czemu nasz kod nie działa. A nie działa dlatego, że ta spopularyzowana w SDK i na stronach linijka nie sprawdza się zawsze. Bo nie może się sprawdzać. Bardzo często kolekcja parametrów przekazywanych do plug-in’ów w kontekście wcale nie zawiera klucza „Target”, a czasem żeby było trudniej ten „Target” wcale nie jest typu DynamicEntity. A jeszcze innym razem najważniejszy dla nas parametr jest w kolekcji OutputParameters, a nie InputParamaters :). Od czego to zależy?

Oczywiście zależy od typu żądania (Request) przekazywanego do warstwy platformy. I tak np. CreateRequest przekazuje Target, ale AssignRequest przekazuje Target i Assignee. A dziesiątki innych requestów przekazuje jeszcze inne parametry. Żeby trochę ułatwić życie piszącym plug-in’y zebrałem najbardziej popularne wiadomości (messages) i wypisałem jakie parametry przekazują one plug-in’om. Poniższa tabela nie zawiera wszystkich żądań (Requests), ale te najbardziej popularne, których zapamiętanie nie raz ułatwi Wam życie…

Wiadomość (message) Nazwa parametru Typ parametru Kolekcja
Create id Guid OutputParameters
Update Target DynamicEntity InputParameters
Delete Target Moniker InputParameters
Retrieve ColumnSet ColumnSetBase InputParameters
Retrieve Target Moniker InputParameters
Retrieve BusinessEntity DynamicEntity OutputParameters
RetrieveMultiple Query QueryExpression InputParameters
RetrieveMultiple ReturnDynamicEntities Boolean InputParameters
RetrieveMultiple BusinessEntityCollection BusinessEntityCollection OutputParameters
Assign Assignee SecurityPrincipal InputParameters
Assign Target Moniker InputParameters

 

Wobec powyższego, wcześniej wspomniana popularna linijka dla operacji Delete wygląda tak:

if(context.InputParameters.Properties.Contains("Target") &&
   context.InputParameters.Properties["Target"] is Moniker)    // Moniker, a nie DynamicEntity!

Miłego programowania!

Reklama