(转)编写发布Plug-In

    Plug-In是一个外部的Assembly被置入到CRM内部用来截取事件并可以和CRM进行交互,处理一些复杂逻辑。常见的可以截取的事件有一个实体的created, updated, or deleted等。Plug-In支持多重租赁,同步和异步运行,离线支持以及统一事件框架等。Plug-in通常会被应用于以下场景:

执行一个复杂的业务逻辑-在无法使用或很难使用JavascriptWorkflow来处理时

在创建/更新实体时从其它系统获取数据

CRM中更新其它系统

创建CRM4.0Plug-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.0Callout我们必须创建基于.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”的引用。这两个DLLSDK"Bin目录中。

3.       在类文件中添加对Microsoft.Crm.SdkMicrosoft.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  (CrmSdk)

http://<servername[:port]>/mscrmservices/2007/metadataservice.asmx  (MetadataServiceSdk)

http://<servername>/MSCRMServices/2007/AD/CrmDiscoveryService.asmx (CrmSdk.Discovery)

并且将Web ReferenceURL 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和某个EntityEvent关联在一起。在我们的特定示例里,我们需要关联Account实体的Create事件:创建Account实体的一条记录时会触发我们的Plug-in. 如下图所示,选择相关的”MessageName””EntityName”并通过点击”Register Step on the PluginType”按钮结束注册。

明白了如何创建一个简单的Plug-in, 同样的方法可以去创建更为复杂的逻辑去集成各种业务和外部系统,甚至用异步方式去创建更好用户体验。

CRM也支持从命令行通过配置文件的方式来注册Plug-In,这个话题我们以后再叙:)

posted @ 2009-05-17 23:15  rapid  阅读(281)  评论(0编辑  收藏  举报