Безопасно-типовой доступ к данным в плагинах CRM 2011
Есть в CRM 2011 такой замечательный метод, как ToEntity. Он позволяет преобразовывать late-bound объекты (в котором поля CRM представлены как атрибуты коллекции) к early-bound объектам (и обратно) с типовой безопасностью. В результате чего, Вы можете получать доступ к полям CRM как к свойствам класса.
Смотрим как юзать:
- Для начала нам нужно получить безопасные типы объектов (на примере Контакта). Для этого воспользуемся утилитой crmsvcutil.exe, которую Вы можете найти в SDK;
- На выходе получим .cs файл, который содержит все нужные объекты (в данном примере только Контакт). Далее подключаем .cs файл к плагину и можем преобразовывать входные параметры и снимки в .Net объекты, которые представляют собой объекты CRM.
using System; using System.Diagnostics; using System.Linq; using System.ServiceModel; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Messages; namespace ToEntity { public class MyPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { // Получаем контекст выполнения из сервиса IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); // Получем входящие параметры и преобразуем их в строго типизированные объект Entity entityInput = (Entity)context.InputParameters["Target"]; Contact contactUpdates = entityInput.ToEntity<Contact>(); // Получем "снимок" параметры и преобразуем их в строго типизированные объект Entity imageBefore = context.PreEntityImages["ContactBefore"] as Entity; Contact contactBefore = imageBefore.ToEntity<Contact>(); // Вытаскиваем один параметр и выводим его decimal creditLimitBefore = contactBefore.CreditLimit != null ? contactBefore.CreditLimit.Value : 0M; throw new Exception(creditLimitBefore.ToString()); } } }
тут довольно простой код: поучаем входящие параметры и снимок объекта и преобразуем их в строготипизированный объект.