CRM4.0里放弃了使用CRM3.0常用的Callout功能,取而代之的是Plug-In。Plug-In是一个外部的Assembly被置入到CRM内部用来截取事件并可以和CRM进行交互,处理一些复杂逻辑。常见的可以截取的事件有一个实体的created, updated, or deleted等。Plug-In支持多重租赁,同步和异步运行,离线支持以及统一事件框架等。Plug-in通常会被应用于以下场景:
l执行一个复杂的业务逻辑-在无法使用或很难使用Javascript和Workflow来处理时
l在创建/更新实体时从其它系统获取数据
l从CRM中更新其它系统
创建CRM4.0的Plug-In通常需要创建一个类库(Class Library)类型的项目。Microsoft Dynamics CRM 4.0是基于.NET Framework 2.0的,所以我们需要创建基于.NET Framework 2.0的项目,但是你可以用Visual Basic或者C#. Microsoft Dynamics CRM 3.0 是基于.NET Framework 1.1的,所以对于CRM 3.0的Callout我们必须创建基于.NET Framework 1.1的项目。
Develop A Custom Plug-in
以下步骤演示了如何创建一个简单的CRM 4.0 plug-in 项目。
1. 创建C# Class Library类型项目,命名为myPlugIn。
2. 添加对”Microsoft.Crm.Sdk.dll”和”Microsoft.Crm.SdkTypeProxy.dll”的引用。这两个DLL在SDK"Bin目录中。
3. 在类文件中添加对Microsoft.Crm.Sdk和Microsoft.Crm.SdkTypeProxy命名空间的应用,并且将类继承于IPlugin接口。
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
namespace myPlugIn
{
public class Class1 : IPlugin
{
}
}
4. 实现IPlugin接口的方法-如果你的类继承了IPlugin接口,那么Execute方法是必须被实现的。
作为演示我们让这个Plugin在创建一个Account时(后)将它的Unique Identifier(AccountID)更新到Account Description字段里。
#region IPlugin Members
public void Execute(IPluginExecutionContext context)
{
DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"];
if (entity.Name == EntityName.account.ToString())
{
Guid id = (Guid)context.OutputParameters.Properties["Id"];
Key myKey = new Key(id);
if (!entity.Properties.Contains("accountid"))
{
entity.Properties["accountid"] = myKey;
}
if (!entity.Properties.Contains("description"))
{
entity.Properties["description"] = "GUID = " + id.ToString();
ICrmService service = context.CreateCrmService(true);
service.Update(entity);
}
}
}
#endregion
5. 程序功能的实现就算完成了。但作为可以部署的DLL(为了安全的缘故)我们必须对这个项目实行强命名。
对项目进行强命名,在Solution Explorer中右键点击项目名称然后选择Properties -> Signing. 选择”Sign the assembly”复选框并通过”New…”下拉选项来添加新的SNK文件。保存各种更改,Build项目,下一步就是部署了。
编译PluginRegistration工具
为了部署我们的Plugin,我们需要注册它。两种方法可以选择:编程方式或者用PluginRegistratin工具。PluginRegistration看起来有点奇怪,说是个工具,实际上提供的是源代码,它也是由SDK提供的,地址在:CrmSdk4"SDK"Tools"PluginRegistration. 因为是源码,所以我们首先需要用Visual Studio 2005打开PluginRegistration.sln解决方案文件。
打开解决方案后,首先需要添加两个丢失的Web References.
http://<servername>/MSCRMServices/2007/CrmServiceWsdl.aspx
http://<servername>/MSCRMServices/2007/AD/CrmDiscoveryService.asmx
并且将Web Reference的URL Behavior设置为Static. 最终完成的结果类似如下图所示:
现在我们可以成功的编译项目了,当编译完项目后我们可以在CrmSdk4"SDK"Tools"PluginRegistration"bin"Debug目录下找到PluginRegistration.exe文件,为了更方便的使用,你可以将这个工具集成到Visual Studio IDE中,这里我们就不讲这个了,可以直接通过运行PluginRegistration.exe来启动我们的注册过程。
注册Plug-in
运行PluginRegistration工具之后,连接CRM Server的窗体就会出现。在这个窗体中输入你的用户名和密码来连接到你的CRM Server上。注意:这里输入的用户名密码必须是有效的登录到CRM 里的帐户(同时也是一个邮箱的Windows(Domain)帐户)。然后可以通过”Get Organizations”按钮来获取CRM里的组织。如果不能连接,将会提示错误。
选择你需要将Plugin注册到的Organization并且点击”Get Connection”按钮。如果成功连接这个Organization将会弹出如下图所示的提示框:
并且同时会将窗体上放的”Assembly Registration”和”Step Registration”按钮Enable. 点击”Assembly Registration”按钮开始我们的注册。通过点击Assembly Location旁边的”…”浏览按钮选择我们的Plugin类库DLL, 然后点击”Register”按钮来注册。注册完毕后,PluginRegistration会弹出一个对话框来提示是否成功。如果成功的话,对话框里会含有一个Assembly ID,如下图所示:
我们可以通过”Get Assemblies”来验证我们上面的注册过程。如果注册成功,你会在下边的Plugin List里边看到刚才注册的信息:
既然我们已经将自定义的插件程序集注册给了CRM,其实这就相当于我们给一个普通的项目加了引用。但是由于插件是个特定的动作关联的,所以我们接下来要做的事情就是将这个DLL和某个Entity,Event关联在一起。在我们的特定示例里,我们需要关联Account实体的Create事件:创建Account实体的一条记录时会触发我们的Plug-in. 如下图所示,选择相关的”MessageName”和”EntityName”并通过点击”Register Step on the PluginType”按钮结束注册。