Microsoft CRM 2011中,包括有两个web service,分别提供了一组方法,通过调用不同的web服务,可以完成不同的功能。
这两个web服务分别是IDiscoveryService web服务以及IOrganization web服务。
IDiscoveryService web服务:一个单独的MS CRM安装中,可以在某台服务器上面部署有多个组织。在存储层角度看,就是一个MS CRM安装,对应一个MSCRM_Config数据库,而每个组织对应一个<组织名称>_MSCRM数据库。如下图所示。
可以看到,有一个MSCRM_Config数据库,而其他的组织相关的数据库包括有Demo_MSCRM等等多个以”_MSCRM”结尾的数据库。
在MSCRM_CONFIG数据库中,存储了不同组织以及该组织对应的数据库。换言之,为了访问业务数据,需要创建sqlConnection实例,那么SqlConnection实例的连接字符串如何确定呢。因为我们知道组织的唯一名称,那么,就可以查询MSCRM_CONFIG数据库,然后,找到相应的连接字符串,赋值给SqlConnection的ConnectionString属性。而后,就可以使用该SqlConnection实例,访问相关组织的数据了。当然,如此直接的访问后台数据表的方式,在MS CRM开发中是不允许的,所以,MS CRM提供了IDiscoveryService服务,使得开发人员可以根据组织的唯一名称以获取该组织的OrganizationService Web服务的Url地址。
IDiscoveryService接口公布的方法是Execute方法,该方法接收的参数为DiscoveryRequest的子类实例。返回的是DiscoveryResponse的子类实例。类树如下图所示。
从上图可见,可以向DiscoveryService提交的请求包括有:
a) RetrieveOrganizationsRequest请求,获取当前MS CRM安装中所有的组织信息。该请求接受的参数为
属性名称 类型 描述 AccessType EndpointAccessType 用于设定需要获取的服务终端点的类型,可选值包括有Default、Internal以及Intranet Release OrganizationRelease 用于设定获取的终端点的版本,可选值包括有Current或者V5 与RetrieveOrganizationsRequest请求对应的响应是RetrieveOrganizationsResponse,该请求中,就一个属性Details,该属性的类型为OrganizationDetailCollection,是一个包含了当前MS CRM部署中,所有组织的详细信息数组,每个组织的详细信息存放在OrganizationDetail的实例中。OrganizationDetail的属性包括有
属性名称 类型 描述 OrganizationId Guid 组织的唯一ID FriendlyName String 组织的友好名称 OrganizationVersion String 组织的版本号 UrlName String OrganizationService服务中,使用的组织名称 UniqueName String 组织的唯一名称 Endpoints EndpointCollection 组织的各个终端点的集合,每个终端点包括有服务的类型以及地址 State OrganizationState 组织的状态,包括有Enabled(已启用)/Disabled(已禁用)两种状态
- b) RetrieveOrganizationRequest请求,用于获取给定唯一名称组织的信息,该请求的接受的参数为:
属性名称 类型 描述 AccessType EndpointAccessType 用于设定需要获取的服务终端点的类型,可选值包括有Default、Internal以及Intranet Release OrganizationRelease 用于设定获取的终端点的版本,可选值包括有Current或者V5 UniqueName String 用于设定组织的唯一名称 - 返回值是RetrieveOrganizationResponse对象,该对象中包含的属性是类型为OrganizationDetail的Detail属性。关于OrganizationDetail类的信息前面已经介绍了,在此不赘述。
- c) RetrieveUserIdByExternalIdRequest请求,用于CRM Live模式下,通过该请求,可以获取与给定Windows Live ID相关的CRM Online用户的ID。
调用IDiscoveryServic的Execute方法的样例代码如下:
1 //实例化RetrieveOrganizationsRequest请求
2 RetrieveOrganizationsRequest orgsRequest = new RetrieveOrganizationsRequest()
3 {
4 AccessType = EndpointAccessType.Default,
5 Release = OrganizationRelease.Current
6 };
7
8 //调用IDiscoveryService的Execute方法,传入RetrieveOrganizationsRequest类型参数,返回RetrieveOrganizationsResponse类型的响应
9 RetrieveOrganizationsResponse organizations = (RetrieveOrganizationsResponse)service.Execute(orgsRequest);
10
11 //枚举当前CRM部署中的所有组织的信息
12 foreach (OrganizationDetail organization in organizations.Details)
13 {
14 Console.WriteLine("Organization Name: {0}", organization.FriendlyName);
15 Console.WriteLine("Unique Name: {0}", organization.UniqueName);
16 Console.WriteLine("Endpoints:");
17 foreach (var endpoint in organization.Endpoints)
18 {
19 Console.WriteLine(" Name: {0}", endpoint.Key);
20 Console.WriteLine(" URL: {0}", endpoint.Value);
21 }
22 }
23
24 //实例化RetrieveOrganizationRequest请求,获取当前部署中,最后一个组织的唯一名称
25 RetrieveOrganizationRequest orgRequest = new RetrieveOrganizationRequest()
26 {
27 UniqueName = organizations.Details[organizations.Details.Count - 1].UniqueName,
28 AccessType = EndpointAccessType.Default,
29 Release = OrganizationRelease.Current
30 };
31
32 //调用IDiscoveryService的Execute方法,获取给定唯一名称组织的信息
33 RetrieveOrganizationResponse org = (RetrieveOrganizationResponse)service.Execute(orgRequest);
Microsoft Dynamics CRM 2011的编程模型如下图所示。
由上向下看,元数据以及业务数据经过业务逻辑层的处理、提供给微软CRM的WCF Service进行使用,在WCF Service的服务契约中,包含一组消息Message以及一组实体信息。
客户端,可以通过REST方式或者SOAP方式,完成对WCF Service的调用与访问,当然,客户端的一切访问与操作,都需要是处于安全认证通过的基础之上进行的。
编程模式包括有如下的几种方式:
早绑定模式:MS CRM 2011使用实体数据模型以及WCF数据服务技术,提供了一组工具,从而令操作、访问CRM系统的步骤得到大大的简化;同时,开发人员也可以通过LINQ,操作、访问CRM系统中的数据。使用早绑定模式,需要首先使用sdk中提供的CrmSvcUtil工具,连接目标CRM组织,由该工具生成特定于该组织的C#代码文件,将该文件添加到C#工程中,以便后续的开发使用,在每次组织的架构出现变化的时候,例如实体信息发生变化、字段信息发生变化、关联信息发生变化等等变化时,都需要重新使用CrmSvcUtil工具生成新的C#代码文件,重新编译引用了该文件的工程;
晚绑定模式:绑定的早与晚,就是在于程序被编译时是否进行类型检测,如果进行检测,那么就是早绑定模式,编译时不检测,直到运行时才进行检测,就是晚绑定模式。晚绑定模式下,只需要在Visual Studio的工程中,添加SDK中提供的Microsoft.Xrm.SDK装配件以及Microsoft.CRM.SDK装配件即可。晚绑定模式的优点在于,更利于团队协作。例如业务分析人员了解了需求,实施团队讨论了实现方案、设定了需要创建的实体、相关的字段信息以及需要的插件组件,此时,使用晚绑定模式,那么插件开发人员就可以依照方案中的字段规格表进行组件开发,而不必像早绑定模式下,需要等待应用顾问完成元数据定义后,再进行开发——因为晚绑定模式下,编译期是不会进行类型检测的。在应用顾问完成元数据定义(包括实体定义、字段定义、关联定义、表单定义等)后,开发顾问将编写的插件部署到CRM系统中,即可以进行联合的测试了。可见,晚绑定模式对于基于设计文档进行工作的团队型实施,是会节省大量的时间——只要设计文档出来,应用顾问负责元数据建设、开发顾问进行C#代码开发,二者可以并行工作,而不必串行、一步步的依次工作了;
REST模式:REST终端点为Ajax客户端以及Silverlight客户端提供了另一种访问CRM数据的接口。使用REST方式,就可以基于一个URI,完成对CRM数据的获取、更新、删除等等操作。而基于URI方式的访问,比使用SOAP方式,要简单很多,毕竟一个URI比一个SOAP头加上一个SOAP正文的内容要少很多拼接内容的。
WSDL模式:主要用于非.Net平台的第三方客户端所使用,例如Java客户端、IPhone客户端,就可以使用WSDL方式,与CRM系统进行通讯。
在CRM项目的实施中,典型的扩展编程,集中在REST、早绑定以及晚绑定三种模式下。窃以为,REST方式,主要用于表单页面的扩展,便于使用Javascript与CRM系统进行通讯;早绑定和晚绑定主要用于插件、自定义工作流活动、ISV自定义网站或页面以及Silverlight客户端开发。由于Json是不能够跨域访问数据的,所以在其他网站中,使用REST方式,应该是无法和CRM进行通讯的。
早绑定、晚绑定模式在MS CRM4以及MS CRM 2011中,已经发生了很大的改变。
在MS CRM 4时代,通过在工程中,添加web服务应用,基于web服务描述语言(Web Service Description Language),由visual studio生成代理类,从而可以在工程中,使用早绑定的方式完成对crm的操作,而使用动态实体DynamicEntity类,作为晚绑定编程操作的载体。在CRM4中,在开发插件以及自定义工作流活动中,需要使用晚绑定方式进行编程。
这一切,在MS CRM 2011中已经发生了巨大的改变——在CRM 2011中,已经不再使用WSDL了,而是通过添加Microsoft.Xrm.SDK装配件以及Microsoft.CRM.SDK装配件可以连接CRM系统中的早绑定类型以及晚绑定类型。这种编程方式就被称为晚绑定模式。通过使用Entity类,可以完成晚绑定模式下的编程。Entity类中,通过相应字段的逻辑名称,访问实体实例的字段,从而,获取或者设置该字段的数值。
此外,除了晚绑定模式,还可以通过CrmSvcUtil工具,基于相应组织的元数据,生成C#代码,将该C#代码文件添加到项目中,就可以借助Visual Studio的智能感知以及类型检测,加快开发顾问开发的速度。
MS CRM 4到MS CRM 2011的编程模式上面的变化,来自于系统架构上面的调整。在CRM 4中,实体的类树结构如下图所示。动态实体类DynamicEntity以及具体的业务实体类(例如客户account)都是继承自抽象类BusinessEntity,DynamicEntity类和account类之间无法进行互相强制转换。
而在MS CRM 2011中,该类树结构已经进行简化,如下图所示。可见,动态类DynamicEntity,已经被取消,该类已经被Entity类所取代,同时Entity类不再是抽象类了,已经可以被实例化。
所以,如下的代码,在CRM 2011编程中,是成立的了。
Account entity = new Account(); entity["name"] = "My Account"; //晚绑定 entity.AccountNumber = "1234"; //强类型,早绑定