Zazwyczaj informowałem o nowych wersjach SDK za pomocą krótkiego opisu. W przypadku CRM SDK 4.0.12 opis nie może być krótki. Takie SDK u innych producentów systemów CRM nazywałoby się „major platform upgrade” i kosztowałoby tyle, co kolejna wersja systemu. SDK 4.0.12 to zmiana spojrzenia na platformę Microsoft Dynamics CRM! To również totalne przełączenie na koncepcję xRM! Ja osobiście jestem w szoku :). Nowe SDK przygotowuje nas po prostu do gładkiego przejścia do CRM 5 i daje już teraz dostęp do funkcjonalności SDK CRM 5.
David Jennaway już sporo opisał na swoim blogu, ale myślę, że można by napisać ciągle więcej o tej rewolucji po polsku. Tak więc… ;P:
SDK 4.0.12 wprowadza pojęcia „Advanced Developer Extensions” czyli „Zaawansowanych rozszerzeń programistycznych”, które technicznie nazwane są po prostu xRM’em. W skrócie polegają na tym, że możemy korzystać z platformy Dynamics CRM w zupełnie nowy sposób. I tak:
- nowe SDK pozwala na korzystanie z danych w Dynamics CRM za pomocą LINQ!!! Niech ten piękny kod powie sam za siebie:
var marketingListsWithCalculations =
from marketingList in crm.lists
select new { marketingList.listname, Cost = marketingList.cost + 100 }; - nowe SDK pozwala na używanie natywnych typów .NET!!! W tym typów nullowalnych (o których nota bene pisałem ostatni projekt w szkole 😉 ), czyli np. short? a nie short, dzięki czemu unikamy konieczności ustawiania IsNullSpecified
- możemy budować źródła danych za pomocą klasy DataContext
- nowe SDK dostarcza narzędzie CrmSvcUtil, które pozwala budować lokalne i silnie typowane odzwierciedlenia bazy CRM, czyli klasy reprezentujące obiekty i DTO (Data Transfer Object). Dzięki temu można pisać kod oparty o LINQ
- nowe SDK daje wsparcie dla WCF! poprzez generowanie klas kontekstowych za pomocą CrmSvcUtil
- z nowym SDK możemy robić tzw. batch updates!!! To z kolei znaczy, że nie musimy już robić tysiąca wywołań Update(). Zamiast tego możemy modyfikować dane „lokalnie”, cache’ować je i dopiero za jednym wywołaniem aktualizować wszystkie na raz! Tutaj przykład:
contact.Email emailaddress1 = "janko@x.com";
contact.contact_customer_accountsParentCustomerAccount = account;
contact1.Firstname firstname = "Jakub";crm.UpdateObject(contact);
crm.UpdateObject(contact1);// zapisywanie do bazy
crm.SaveChanges();
- nowe SDK pozwala pobierać obiekty powiązane za pomocą gotowych metod. Dzięki temu zamiast budować QueryExpression i podawać GUID’y możemy po prostu wywołać metodę GetRelatedEntities()
- nowe SDK daje zupełnie nowe możliwości budowania relacji między obiektami z poziomu kodu (poprzez metodę SetLink() albo aktuzalizację klucza obcego). Wystarczy zerknąć na przykłady poniżej, żeby zobaczyć dlaczego mówię o rewolucji :):
crm.SetLink(contact, "contact_customer_accounts", account);
crm.SaveChanges();
albo:
contact.contact_customer_accounts = account;
crm.UpdateObject(contact);
crm.SaveChanges();
- nowe SDK zawiera informacje o budowaniu tzw. Visual Charts, czyli dynamicznych wykresów z danych w CRM. W CRM 5 wykresy te będą mogły być wyświetlane na listach rekordów, aktualnie udostępnia je w ograniczonej postaci tylko CRM Online R4.
- nowe SDK zawiera zupełnie nowe rozdziały o uwierzytelnianiu w modelach serwer-serwer i impersonacji
- nowe SDK zawiera mnóstwo nowych rozdziałów, w tym rozdziały opisujące dokładnie dlaczego należy korzystać z DynamicEntity, z klasy IsvReadiness i kilkunastu innych
- nowe SDK zawiera rozdziały o dobrych praktykach w pisaniu zewnętrznych aplikacji korzystających z CRM i o sugestiach związanych z wydajnością takich aplikacji
Na razie nikt nie wie, czy ukaże się CRM SDK 4.0.13. A to dlatego, że 4.0.12 zbliża nas wielkimi krokami do CRM 5. Już teraz Microsoft przyzwyczaja programistów do rozwiązań, które w gotowej platformie zobaczymy za kilka miesięcy. SDK 4.0.12 to jest coś pięknego. To dla takich chwil warto kochać Dynamics CRM’a! I w takich chwilach wiem, czemu kocham MS a nie Google’a, który za major update uważa nowy kształt guzika „szukaj” :D.
PS. SDK 4.0.12 jest do ściągnięcia tutaj: http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&displaylang=en
Wydaje mi się, że wersji 13 nie będzie bo MS nie korzysta z tej liczby przy innych produktach 🙂 Nie wiadomo jednak czy ta konwencja ma zastosowanie i tutaj 🙂
Nowe SDK faktycznie wprowadza wiele nowości, w tym chyba największą – natywne wsparcie dla LINQ – dostępne wcześniej jedynie jako komercyjne rozwiązania firm trzecich oraz jakieś tam darmowe półprodukty.
Nie ma jednak róży bez kolców. Warto wspomnieć choćby o kilku z nich:
– Implementacja LINQ tłumaczy zapytania na wywołania standardowych CRM’owych web serwisów. Wynikają z tego ogromne ograniczenia, jak choćby brak możliwości „selekcenia” wartości z encji „zjoinowanych”.
Przyznam, że jak przeczytałem o wsparciu LINQ to była to pierwsza zaleta jaka przyszła mi do głowy, a tu niestety d*pa.
Samo pisanie zapytań w formie LINQ zamiast QueryExpression, czy FetchXML jest przejemnie, ale nic ponad to. Parę linijek kodu mniej i tyle. Dla wprawnego klepacza kodu nie jest to wielka zaleta.
– Oficjalnie, według dokumentacji LINQ może być używany tylko w rozwiązaniach zewnętrznych. Bez manipulacji w miejscach gdzie nie powinno się manipulować nie użyjemy tego w pluginach, customowych przepływach itp.
W skrócie – początkowo się zachwyciłem. Po ochłonięciu i poznaniu szczegółów doszedłem jednak do wniosku, ze to bardziej bajer niż rewolucja.
Akurat masz rację tutaj 🙂 MS (ani ja) nie mówi na razie, że do CRM’a da się dostać bezpośrednio przez LINQ. Oczywiście buduje się DataContext, wszystko jest jak w LINQ, ale na poziomie platformy mamy ograniczenia FecthXML’a oraz aktualnych web services, które nie pozwolą zrobić selecta z kolumn z encji połączonych JOIN’em. I wbrew obiegowej opinii, jaką słyszałem ostatnio, LinkEntity NIE służy do tego :).