为什么在Dynamics 365 XRM工具SDK中使用IOrganizationService代替CrmServiceClient?

时间:2019-01-03 21:26:07

标签: c# .net dynamics-crm dynamics-crm-365

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

    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 Service Client,如下所示:

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看起来更快,更简单,更高效且功能更丰富。

关于示例代码为何总是具有附加的间接层的任何想法吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

IOrganizationServiceinterface,它定义了访问所有Dynamics函数所需的最基本方法。有general benefits个接口可供使用。

IOrganizationService自CRM 2011年以来就存在,而CrmServiceClient是在CRM 2016年左右引入的。使用IOrganizationService的一个简单原因是它存在的时间更长,并且存在于现有代码中基地。

CrmServiceClient实现IOrganizationService,并且还提供了一系列其他方法,例如通过CRM进行身份验证。在引入CrmServiceClient之前,我们使用CrmConnection对CRM进行身份验证。当我们不得不从CrmConnection迁移到CrmServiceClient时,我们只需要更改为CrmServiceClient,解压缩IOrganizationService,其余代码库就保持不变。

编程为IOrganizationService界面使您的代码更加可移植,并且可重复使用。例如;当您不知道将要创建服务对象时。

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

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

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