为什么在 Dynamics 365 XRM 工具 SDK 中使用 IOrganizationService 而不是 CrmServiceClient?
Why use IOrganizationService instead of CrmServiceClient in Dynamics 365 XRM tooling SDK?
用于访问 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,看起来既更快、更简单、更高效,也更丰富。
知道为什么示例代码总是有这个额外的间接层吗?
谢谢。
IOrganizationService
是一个 interface
,它定义了访问所有 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;
出于测试目的,当您想使用新的 MockOrganizationService
class.
模拟 IOrganizationService
当您想在外部应用程序和插件之间移动代码时。在插件中未提供 CrmServiceClient
。
用于访问 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,看起来既更快、更简单、更高效,也更丰富。
知道为什么示例代码总是有这个额外的间接层吗?
谢谢。
IOrganizationService
是一个 interface
,它定义了访问所有 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;
出于测试目的,当您想使用新的 MockOrganizationService
class.
IOrganizationService
当您想在外部应用程序和插件之间移动代码时。在插件中未提供 CrmServiceClient
。