首页 > 解决方案 > 为什么在 Dynamics 365 XRM 工具 SDK 中使用 IOrganizationService 而不是 CrmServiceClient?

问题描述

Microsoft 访问 Dynamics 的示例代码通常如下所示:

    static void Main(string[] args)
    {
        try
        {
            string connectionString =
                "Url=https://myorg.crm.dynamics.com; Username=me@myorg.com; Password=******; authtype=Office365";

            using (CrmServiceClient conn = new CrmServiceClient(connectionString))
            {
                // Cast the proxy client to the IOrganizationService interface.
                IOrganizationService orgService = (IOrganizationService)conn.OrganizationWebProxyClient ??
                                                  conn.OrganizationServiceProxy;

                Console.WriteLine("Microsoft Dynamics CRM version {0}.", ((RetrieveVersionResponse)orgService.Execute(new RetrieveVersionRequest())).Version);
            }
        }
        catch (FaultException<OrganizationServiceFault> osFaultException)
        {
            Console.WriteLine("Fault Exception caught");
            Console.WriteLine(osFaultException.Detail.Message);
        }
        catch (Exception e)
        {
            Console.WriteLine("Uncaught Exception");
            Console.WriteLine(e);
        }
    }
}

但是直接使用 Crm 服务客户端同样可能(并且更简单),如下所示:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string connectionString =
                "Url=https://myorg.crm.dynamics.com; Username=me@myorg.com; Password=******; authtype=Office365";

            using (CrmServiceClient conn = new CrmServiceClient(connectionString))
            {
                Console.WriteLine("Microsoft Dynamics CRM version {0}.", ((RetrieveVersionResponse)conn.Execute(new RetrieveVersionRequest())).Version);
            }
        }
        catch (FaultException<OrganizationServiceFault> osFaultException)
        {
            Console.WriteLine("Fault Exception caught");
            Console.WriteLine(osFaultException.Detail.Message);
        }
        catch (Exception e)
        {
            Console.WriteLine("Uncaught Exception");
            Console.WriteLine(e);
        }
    }
}

我的问题:为什么要使用该 IOrganizationService 属性?似乎它只有 CrmServiceClient 功能的一个子集。而直接使用的 CrmServiceClient 看起来既更快、更简单、更高效,而且功能更丰富。

关于为什么示例代码总是有这个额外的间接层的任何想法?

谢谢。

标签: c#.netdynamics-crmdynamics-crm-365

解决方案


IOrganizationService是一个interface定义访问所有 Dynamics 功能所需的最基本方法。使用接口有许多普遍的 好处。

IOrganizationService自 CRM 2011 以来一直存在,而CrmServiceClient在 CRM 2016 前后引入。使用的一个简单原因IOrganizationService是它的存在时间更长并且存在于现有代码库中。

CrmServiceClient实现IOrganizationService,并且还提供了一系列其他方法,例如使用 CRM 进行身份验证。在CrmServiceClient介绍之前,我们用于CrmConnection向 CRM 进行身份验证。当我们不得不从 to 迁移时CrmConnectionCrmServiceClient我们只需要更改 to CrmServiceClient, extractIOrganizationService并且其余代码库保持不变。

对接口进行编程IOrganizationService使您的代码更具可移植性和可重用性。例如; 当您不知道您的服务对象将被创建时。

IOrganizationService orgService = IOrganizationService)conn.OrganizationWebProxyClient ?? conn.OrganizationServiceProxy;

当您想IOrganizationService使用新MockOrganizationService类进行模拟时,出于测试目的。

当您想在外部应用程序和插件之间移动代码时。在插件CrmServiceClient中未提供。


推荐阅读