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"; //强类型,早绑定