Разработка
28
Окт
0

Безопасно-типовой доступ к данным в плагинах 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());
        }
    }
}

тут довольно простой код: поучаем входящие параметры и снимок объекта и преобразуем их в строготипизированный объект.


Комментарии (0)

*

code