В чем разница между IOrganizationService и OrganizationServiceProxy в Dynamics CRM?Microsoft Dynamics CRM 2011
Связано ли это с доступом к службам в контексте Crm и вне контекста Crm?
В чем разница между IOrganizationService и OrganizationServiceProxy в Dynamics CRM?Microsoft Dynamics CRM 2011
Связано ли это с доступом к службам в контексте Crm и вне контекста Crm?
IOrganisationService используется в плагинах и пользовательских операциях рабочего процесса и получен из контекста выполнения.
В то время как OrganisationServiceProxy в основном используется для кода, выполняющегося за пределами приложения Dynamics CRM.
Простой ответ IOrganizationService - это интерфейс, тогда как OrganizationServiceProxy - это класс, который реализует интерфейс IOrganizationService. Это означает, что любые свойства/методы в IOrganizationService по умолчанию также доступны через OrganizationServiceProxy.
При запуске в контексте плагина или пользовательского действия рабочего процесса он предоставит вам доступ к сервису IOrganizationService, который вы можете использовать для опроса CRM.
Если вы пишете что-то внешнее, например, службу Windows или отдельное приложение, тогда вы обычно используете класс OrganizationServiceProxy для настройки соединения с веб-службой CRM. Вы можете, очевидно, присвоить это службе IOrganizationService позже (например, инъекции зависимостей/для целей модульного тестирования). Или, если вы предпочитаете, нет причин, по которым вы можете продолжать использовать OrganizationServiceProxy.
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
Если вы используете сборки sdk (в частности, microsoft.xrm.sdk.dll), то вы будете использовать реализацию IOrganizationService, а время вызова будет идентичным. Основная цель OrganizationServiceProxy заключается в предоставлении возможности для установления соединения с CRM в коде, который работает за пределами CRM .The OrganizationServiceProxy класс реализует IOrganizationService и предоставляет заверенную канал WCF для службы организации
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
Возможный дубликат [CRM 2011 OrganizationServiceProxy против OrganizationServiceContext ] (http://stackoverflow.com/questions/5903422/crm-2011-organizationserviceproxy-vs-organizationservicecontext) – MaPi