2015-05-06 7 views
3

В чем разница между IOrganizationService и OrganizationServiceProxy в Dynamics CRM?Microsoft Dynamics CRM 2011

Связано ли это с доступом к службам в контексте Crm и вне контекста Crm?

+0

Возможный дубликат [CRM 2011 OrganizationServiceProxy против OrganizationServiceContext ] (http://stackoverflow.com/questions/5903422/crm-2011-organizationserviceproxy-vs-organizationservicecontext) – MaPi

ответ

3

IOrganisationService используется в плагинах и пользовательских операциях рабочего процесса и получен из контекста выполнения.

В то время как OrganisationServiceProxy в основном используется для кода, выполняющегося за пределами приложения Dynamics CRM.

11

Простой ответ IOrganizationService - это интерфейс, тогда как OrganizationServiceProxy - это класс, который реализует интерфейс IOrganizationService. Это означает, что любые свойства/методы в IOrganizationService по умолчанию также доступны через OrganizationServiceProxy.

При запуске в контексте плагина или пользовательского действия рабочего процесса он предоставит вам доступ к сервису IOrganizationService, который вы можете использовать для опроса CRM.

Если вы пишете что-то внешнее, например, службу Windows или отдельное приложение, тогда вы обычно используете класс OrganizationServiceProxy для настройки соединения с веб-службой CRM. Вы можете, очевидно, присвоить это службе IOrganizationService позже (например, инъекции зависимостей/для целей модульного тестирования). Или, если вы предпочитаете, нет причин, по которым вы можете продолжать использовать OrganizationServiceProxy.

1

OrganizationServiceProxy - это реализация IOrganizationService. Это похоже на случай, поскольку List - это реализация интерфейса IList. Если говорить о том, почему на Земле Microsoft предоставляет интерфейс и реализацию помимо тестирования, я могу предложить один интересный случай, который произошел в моей жизни. Мне нужно было перечитать информацию из динамики crm. В моем случае OrganizationServiceProxy быстрее истек, затем информация была получена из CRM. Для того, чтобы исправить это, я создал следующий фасад:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using Microsoft.Xrm.Sdk; 
    using Microsoft.Xrm.Sdk.Query; 

    namespace OrganizationService 
    { 
     public delegate IOrganizationService CreateOrganizationServiceFunc(string organizationServiceUrl, string userName, string password, TimeSpan? timeout = null, bool useSSL = false); 
     public class OrganizationServiceFacade : IOrganizationService 
     { 
      private IOrganizationService _serviceInternal { get; set; } 

      private CreateOrganizationServiceFunc _creator; 

      Func<IOrganizationService> _orgServiceFactory; 
      public OrganizationServiceFacade(Func<IOrganizationService> orgServiceFactory) 
      { 
       _orgServiceFactory = orgServiceFactory; 
       CreateService(); 
      } 

      private void CreateService() 
      { 
       _serviceInternal = _orgServiceFactory(); 
      } 

      public void Associate(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities) 
      { 
       try 
       { 
        _serviceInternal.Associate(entityName, entityId, relationship, relatedEntities); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        _serviceInternal.Associate(entityName, entityId, relationship, relatedEntities); 
       } 
      } 

      public Guid Create(Entity entity) 
      { 
       Guid result; 
       try 
       { 
        result = _serviceInternal.Create(entity); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        result = _serviceInternal.Create(entity); 
       } 
       return result; 
      } 

      public void Delete(string entityName, Guid id) 
      { 
       try 
       { 
        _serviceInternal.Delete(entityName, id); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        _serviceInternal.Delete(entityName, id); 
       } 
      } 

      public void Disassociate(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities) 
      { 
       try 
       { 
        _serviceInternal.Disassociate(entityName, entityId, relationship, relatedEntities); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        _serviceInternal.Disassociate(entityName, entityId, relationship, relatedEntities); 
       } 
      } 

      public OrganizationResponse Execute(OrganizationRequest request) 
      { 
       try 
       { 
        return _serviceInternal.Execute(request); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        return _serviceInternal.Execute(request); 
       } 
      } 

      public Entity Retrieve(string entityName, Guid id, ColumnSet columnSet) 
      { 
       try 
       { 
        return _serviceInternal.Retrieve(entityName, id, columnSet); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        return _serviceInternal.Retrieve(entityName, id, columnSet); 
       } 
      } 

      public EntityCollection RetrieveMultiple(QueryBase query) 
      { 
       try 
       { 
        return _serviceInternal.RetrieveMultiple(query); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        return _serviceInternal.RetrieveMultiple(query); 
       } 
      } 

      public void Update(Entity entity) 
      { 
       try 
       { 
        _serviceInternal.Update(entity); 
       } 
       catch (System.ServiceModel.Security.MessageSecurityException mex) 
       { 
        CreateService(); 
        _serviceInternal.Update(entity); 
       } 
      } 
     } 
    } 

, а затем у меня есть простой механизм повторного подключения:

 Trace.TraceInformation("Creation of CRM connection"); 
     for (var maxTry = 0; maxTry < reconectionTries; maxTry++) 
     { 
      try 
      { 
       var service = new OrganizationServiceFacade(() => 
        XrmServiceCreator.CreateOrganizationService("organizationServiceUrl", 
         "username", 
         "userpassword", 
         DefaultTimeout)); 

       var response = (WhoAmIResponse) service.Execute(new WhoAmIRequest()); 
       if (response.Results.Count == 0) 
       { 
        throw new InvalidDataException($"CRM returned no data in response. Number of retries is: {maxTry}, user name: {ConfigSettings.Default.RunAsUser}, Default timeout = {DefaultTimeout}"); 
       } 

       return service; 
      } 
      catch (Exception e) 
      { 
       Trace.TraceError("Exception: {0}", e); 
      } 
     } 

метод XrmServiceCreator.CreateOrganizationService возвращает экземпляр IOrganizationService, а за шторы создает экземпляр OrganizationServiceProxy

2

Если вы используете сборки sdk (в частности, microsoft.xrm.sdk.dll), то вы будете использовать реализацию IOrganizationService, а время вызова будет идентичным. Основная цель OrganizationServiceProxy заключается в предоставлении возможности для установления соединения с CRM в коде, который работает за пределами CRM .The OrganizationServiceProxy класс реализует IOrganizationService и предоставляет заверенную канал WCF для службы организации

2

OrganizationService более высокий класс уровня, обеспечивает более богатую функциональность на стороне клиента и фактически использует в нем OrganizationServiceProxy.

Сборка Microsoft.Xrm.Client, которая содержит этот API более высокого уровня, не может использоваться в плагинах и т. Д., Но предназначена для богатых клиентов и ASP.NET.

Следует отметить, что сборка Microsoft.Xrm.Client была удалена из SDK CRM2016. Для проектов 2016 года вы можете рассмотреть возможность использования сборок XRM Toolking.

См. Msdn.microsoft.ком /.../ dn689057.aspx

Он имеет аналогичные функциональные возможности, которые вы упоминаете вокруг диспетчера соединений -msdn.microsoft.com/.../mt608573.aspx

Смежные вопросы