• Mscrm 二次开发之 plugin开发


     

     

    Mscrm 二次开发之 plugin开发

     

    ----------作者:Seer Lin

     

    1,主要流程:

      1),crm里面,当我们对表单进行提交时,事件交由执行管道(Pipeline)去执行,事件执行管道在执行的过程中,又可以引发其他管道的执行,被引发执行的这个管道我们称我"子管道".

      2),每一个管道的执行过程大体上可以分为三部分:PreStage,ExecutingStage,PostStage;PreStage是我们点保存按钮后系统保存事件执行之前,ExecutingStage是系统的执行事件(将数据保存到数据库),PostStage是系统事件执行完毕后.

    2,开发步骤:

          Plugin开发所要做的事情就是在管道的PreStage或者PostStage做我们想要的功能,例如你如果希望在创建一个Account(客户)的时候自动产生一个值作为客户编号accountnumber,那么你可以写一个plugin,然后在Execute 方法里面给实体的accountnumber属性赋值,再将这个plug-incrm自带的注册工具注册到管道的PreStage;如果你想在创建完一个Account(客户)后顺便创建一个task(任务)去跟进这个客户,那么你可以写一个plug-in,然后将这个plug-in注册到管道的PostStage;详细步骤如下:

          1), 创建一个Class library的项目,并将C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly这个文件夹里面microsoft.crm.sdk.dllmicrosoft.crm.sdktypeproxy.dll这两个文件添加到引用.

          2),实现IPlugin接口,并实现里面的Execute(IPluginExecutionContext context)方法,系统源码我没有仔细研究,但我估计是用aop的设计模式,系统执行管道的时候便会调用插件中这个Execute的方法;系统管道执行过程可以用同步的方式也可以用异步的方式,在注册工具可以选择.

          3),将程序进行强签名,密码随便写

          4),注册plug-instep

    Message是指消息类型.因为我们是想在创建Acocunt的时候触发事件,因此我们将Message填为:create

    Primary Entity是我们要创建的实体类型

    Asynchronous是指异步方式执行.假如你执行一个事件要等很长时间,那你就应该选这个,这样用户才不会在界面等很久,因为你如果选同步的方式执行,事件的执行过程,用户UI是卡住的.

    Synchronous是指同步的方式执行,对应那些必须等待所以的事件执行完后才可以做其他操作的,就必须指定为同步

    Triggering是指注册在父管道还是子管道.举个例子,假如你将一个商机转为定单,这个时候系统会做两件事:1,先创建一个定单;2,将商机产品转为定单产品.其中1是在父管道执行,2是在子管道执行;如果你的plugin是监控商机,那就要注册到Parent Pipeline,如果你要监控产品,就要注册到Child Pipeline

    Step Department是指部署方式.Server是插件可以在服务器上运行,Offline是插件可以在离线状态下执行,但很多实体不支持,所以一般不选.

    5),插件调试

             如果你的插件出现了问题,你还可以进行调试,步骤如下

             1)你的plug-in必须复制到C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembl这个文件下面

             2),你的plug-in必须注册为disk模式

    database会将plug-in注册到数据库,对应分布式应用来说,一般选这个,否则你必须将plug-in复制到每台服务器

    disk是将plug-in部署到硬盘,调试的时候必备

    GAC是部署到操作系统的GAC文件下面,比较少用

    3),在程序代码加断点,然后选择调试à附加到进程”,附加到w3wp.exe这个进程

     ===============================================

    因为图片比较麻烦插入,所以我整理成一个word文件,图文并茂,应该比较容易理解,希望对初学者有帮助

    /Files/seerlin/mscrm_plugin开发.doc

     =======================================================================================

    关键代码如下:

    代码
    using System;
    using System.Collections.Generic;
    using System.Text;

    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;

    namespace PluginTest
    {
        
    /// <summary>
        
    /// Description:Demo of plug-in development
        
    /// Author:Seer Lin
        
    /// </summary>
        public class PreCreateAccount : IPlugin
        {

            
    /// <summary>
            
    /// Auto generate a random number as accountnumber.
            
    /// </summary>
            
    /// <param name="context"></param>
            public void Execute(IPluginExecutionContext context)
            {
                
    if (context.InputParameters.Properties.Contains("Target"&& context.InputParameters.Properties["Target"is DynamicEntity)
                {
                    DynamicEntity entity 
    = context.InputParameters.Properties["Target"as DynamicEntity;
                    
    if (entity.Properties.Contains("accountnumber"))
                    {
                        
    throw new InvalidPluginExecutionException("accountnumber can only be set by system");
                    }
                    
    else
                    {
                        StringProperty property 
    = new StringProperty();
                        property.Name 
    = "accountnumber";
                        property.Value 
    = new Random().Next().ToString();//Generate a random number as accountnumber.
                        entity.Properties.Add(property);
                    }
                }
            }
        }



        
    public class PostCreateAccount : IPlugin
        { 
            
    /// <summary>
            
    /// Create a task activity to follow up with the account customer in 7 days when the account is created.
            
    /// </summary>
            public void Execute(IPluginExecutionContext context)
            {
                
    try
                {
                    task followup 
    = new task();
                    followup.subject 
    = "send a email to customer";
                    followup.description 
    = "follow up with the customer";
                    followup.category 
    = context.PrimaryEntityName;
                    followup.scheduledstart
                        
    = followup.scheduledend
                        
    = CrmTypes.CreateCrmDateTimeFromUser(DateTime.Now.AddDays(7));

                    
    //It will return an id after you create a account.
                    if (context.OutputParameters.Properties.Contains("id"))
                    {
                        Guid accountid 
    = new Guid(context.OutputParameters.Properties["id"].ToString());
                        followup.regardingobjectid 
    = new Lookup(EntityName.account.ToString(), accountid);
                    }

                    
    //Value true if you want to use current user to create the task.
                    
    //Value false if you want to use administrator to create the task.
                    ICrmService service = context.CreateCrmService(true);
                    service.Create(followup);
                }
                
    catch (System.Web.Services.Protocols.SoapException ex)
                {
                    
    throw new InvalidPluginExecutionException("An error occourred in CreateAccountHandler plug-in.", ex);
                }

            }
        }
    }

     

  • 相关阅读:
    如何通过js在子页面调用父页面元素的click事件
    时间戳转换成时间格式
    sql 生成某个范围内的随机数
    Ioc思想
    【Sharepoint控件】MOSS模式化窗口
    【Sharepoint代码段】MOSS模拟超级管理员的方法
    【Sharepoint对象模型】MOSS根据模板添加子网站
    【Sharepoint控件】MOSS列表添加时SPUser字段赋值
    【C#代码段】asp在数据库加入数据
    【C#代码段】ajax从asp后台获取数据
  • 原文地址:https://www.cnblogs.com/seerlin/p/1757888.html
Copyright © 2020-2023  润新知