Вам все еще нужно проверить родительский/дочерний конвейеры, чтобы определить, создавать ли ICrmService или CrmService в 2015 году?

В настоящее время мы используем MS Dynamics CRM V4 и находимся в процессе обновления до версии 2015. Мне нужно обновить некоторые из наших плагинов.

Одна из вещей, с которыми я столкнулся, немного сбивает с толку: нужно ли мне все еще делать какую-то проверку на этапе конвейера, чтобы определить, является ли он родителем или дочерним элементом. Насколько я понимаю, родительский и дочерний конвейеры были объединены в 1 с 2011 года, так как же следует изменить следующий код?

public CrmServiceProxy(IPluginExecutionContext context, Guid userId)
{
    if (context.InvocationSource == MessageInvocationSource.Parent)
    {
        iCrmService = context.CreateCrmService(userId);
    }
    else
    {
        try
        {
            RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM");
            string crmUrl = regkey.GetValue("ServerUrl").ToString();
            string crmServiceUrl = string.Concat(crmUrl, "/2007/crmservice.asmx");
            crmService = CreateCrmService(crmServiceUrl, context, userId);
        }
        catch (Exception)
        {
            throw new InvalidPluginExecutionException("Unable to create CrmServiceProxy - the service URL cannot be read from the Registry");
        }
    }
}

Я начал так:

private readonly IOrganizationService iCrmService;
private IOrganizationServiceFactory serviceFactory;

public CrmServiceProxy(IServiceProvider serviceProvider, Guid userId)
{
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

    serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

    if (context.Stage == 10) //10 should indicate it's the parent
    {
        iCrmService = serviceFactory.CreateOrganizationService(context.UserId);
    }
    else
    {
        try
        {
            RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM");
            string crmUrl = regkey.GetValue("ServerUrl").ToString();
            string crmServiceUrl = string.Concat(crmUrl, "/2007/crmservice.asmx");
            iCrmService = serviceFactory.CreateOrganizationService(crmServiceUrl, context, userId); //doesn't work, just something I was trying
        }
        catch (Exception)
        {
            throw new InvalidPluginExecutionException("Unable to create CrmServiceProxy - the service URL cannot be read from the Registry");
        }
    }
}

Итак, я понимаю, что ранее в V4 вам нужно было использовать CrmService для дочерних конвейеров и ICrmService для родительских, поэтому оператор if определял, из какого конвейера он пришел. Однако мне все еще нужно выполнять такую ​​проверку или я могу просто отказаться от всего оператора if и просто создать службу с помощью ICrmService?


person sr28    schedule 30.06.2015    source источник


Ответы (2)


Вам нужно также переписать объявление класса, вот пример, который вы можете использовать:

namespace PluginNamespace
{
    public class MyPluginClass : 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);
            // ...
        }
    }
}
person Guido Preite    schedule 30.06.2015
comment
Спасибо за ответ. Я уже унаследовал IPlugin в коде плагина. Однако я пытаюсь выяснить, нужно ли мне теперь создавать IOrganizationService, если он исходит от родителя, и делать что-то другое, если он исходит от дочернего элемента. Как показывает мой код, в CRM V4 это нужно было сделать путем создания ICrmService, если он был родителем, и CrmService, если он был дочерним. - person sr28; 30.06.2015
comment
если вам нужен IOrganizationService, вам просто нужно использовать код, который я разместил - person Guido Preite; 30.06.2015
comment
Так ты говоришь, что мне больше не нужно проверять родителя или ребенка? - person sr28; 30.06.2015

На самом деле родительский и дочерний конвейеры не были объединены. Они все еще существуют в Dynamics CRM 2011. Думаю, Microsoft упростила модель, чтобы избежать путаницы. Также в CRM 4.0 дочерний конвейер не поддерживал свободный доступ к сервису CRM; отсюда и разные способы создания экземпляров ICrmService.

Например. когда выдается AssignRequest, вызываются следующие шаги плагина:

  1. Подтвердить Назначить
  2. Предварительное назначение
  3. Предоперационное обновление
  4. (Операции с платформой)
  5. Обновление после операции
  6. PostOperate Назначить
  7. Асинхронное обновление
  8. Асинхронное назначение

Шаги 3 и 5 на самом деле являются шагами дочернего конвейера; они оба имеют родительский контекст, принадлежащий сообщению Assign.

person Henk van Boeijen    schedule 30.06.2015
comment
Но, по-видимому, теперь я могу просто использовать один IOrganizationService и не нужно различать CrmService и ICrmService в зависимости от того, был ли он родительским или дочерним? - person sr28; 30.06.2015
comment
Да, на всех этапах вы можете создавать экземпляры IOrganizationService одинаковым образом. - person Henk van Boeijen; 30.06.2015