【问题标题】:Microsoft Dynamics CRM 2011微软动态 CRM 2011
【发布时间】:2015-07-16 03:10:11
【问题描述】:

Dynamics CRM 中的 IOrganizationServiceOrganizationServiceProxy 有什么区别?

是否与在Crm上下文中和在Crm上下文之外访问服务有关?

【问题讨论】:

标签: dynamics-crm crm microsoft-dynamics


【解决方案1】:

IOrganisationService 在插件和自定义工作流活动中使用,并派生自执行上下文。

OrganisationServiceProxy 主要用于在 Dynamics CRM 应用程序之外运行的代码。

【讨论】:

    【解决方案2】:

    最简单的答案是 IOrganizationService 是一个接口,而 OrganizationServiceProxy 是一个实现 IOrganizationService 接口的类。这意味着 IOrganizationService 上的任何属性/方法默认情况下也可通过 OrganizationServiceProxy 获得。

    如果在插件或自定义工作流活动的上下文中运行,它将允许您访问可用于询问 CRM 的 IOrganizationService。

    如果您正在编写一些外部的东西,例如 Windows 服务或独立应用程序,那么您通常使用类 OrganizationServiceProxy 来建立到 CRM Web 服务的连接。您显然可以稍后将其分配给 IOrganizationService (例如,依赖注入/用于单元测试目的)。或者,如果您愿意,没有理由继续使用 OrganizationServiceProxy。

    【讨论】:

      【解决方案3】:

      OrganizationServiceProxy 是 IOrganizationService 的实现。它类似于案例,因为 List 是接口 IList 的实现。如果要说为什么微软除了测试之外还要提供接口和实现,我可以提出一个我生活中发生的有趣案例。我需要重新阅读动态 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 的实例

      【讨论】:

        【解决方案4】:

        如果您使用 sdk 程序集(特别是 microsoft.xrm.sdk.dll),那么您将使用 IOrganizationService 的实现,并且调用时间将相同。 OrganizationServiceProxy 的主要目的是提供在 CRM 外部运行的代码中建立与 CRM 的连接的选项。OrganizationServiceProxy 类实现 IOrganizationService 并为组织服务提供经过身份验证的 WCF 通道

        【讨论】:

          【解决方案5】:

          OrganizationService 是一个更高级别的类,它提供了更丰富的客户端功能,实际上在其中使用了OrganizationServiceProxy

          拥有此更高级别 API 的 Microsoft.Xrm.Client 程序集不能用于插件等,但适用于富客户端和 ASP.NET。

          值得注意的是,Microsoft.Xrm.Client 程序集已从 CRM2016 SDK 中删除。对于 2016 年的项目,您可以考虑使用 XRM Toolking 程序集。

          请参阅 msdn.microsoft.com/.../dn689057.aspx

          它具有您在连接管理器 -msdn.microsoft.com/.../mt608573.aspx 中提到的类似功能

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-29
            • 1970-01-01
            相关资源
            最近更新 更多