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!