Kwiecień 3, 2009 - autor: Kuba Skałbania
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!
Ostatnie komentarze