在 Dynamics CRM 开发中,我们可以使用 JavaScript 在前端对 Entity Form 进行数据操作,与此同时,我们也可以使用 C# 写后台插件,其中就包括了 Plug-in Class 和 Workflow Class,如下图所示,这里也简单阐述下两者在使用上的区别:

Dynamics CRM - Plug-in Class 和 Workflow Class 的用法与区别

图1 Plug-in Class 和 Workflow Class

 

一、调用范围:

       Plug-in Class 是在对 Entity 的创建(Create)和更新(Update)时进行调用,而 Workflow Class 是在 Business Process Flow (BPF) 的 workflow 组件里进行调用。

二、使用方式:

      Plug-in Class:

      编写程序 -> 编译程序集,得到 dll -> 打开 PluginRegistration.exe(路径:SDK 安装目录 > Tools > PluginRegistration)-> 连接 CRM Server -> 选择要部署的 Organization -> 注册 Assembly -> 注册 Step(Create/Update -> Pre-operation/Post-operation) -> 注册 Image(可选,PreImage/PostImage)

      完成以上注册后就可以在 CRM 上被调用了。

Dynamics CRM - Plug-in Class 和 Workflow Class 的用法与区别

图2.1 注册 Plug-in 程序集

 

      Workflow Class: 

      编写程序 -> 编译程序集,得到 dll -> 打开 PluginRegistration.exe -> 连接 CRM Server -> 选择要部署的 Organization -> 注册 Assembly

      在注册完 Workflow 程序集后,将 dll 包装在 workflow 组件中,提供给 BPF 调用。

Dynamics CRM - Plug-in Class 和 Workflow Class 的用法与区别

图2.2 注册 Workflow 程序集

 

Dynamics CRM - Plug-in Class 和 Workflow Class 的用法与区别

图2.3 创建 workflow 组件

 

Dynamics CRM - Plug-in Class 和 Workflow Class 的用法与区别

图2.4 workflow 组件与 BPF

 

Dynamics CRM - Plug-in Class 和 Workflow Class 的用法与区别

图2.5 在 BPF 中使用 workflow 组件

 

 三、获取 Entity 对象的方式:

      Plug-in Class:

Entity entity = (Entity)context.InputParameters["Target"];

      Workflow Class:

Entity entity = service.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new Microsoft.Xrm.Sdk.Query.ColumnSet(true));

 

四、代码示例:

      Plug-in Class:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;

namespace CRMPluginProject_Test
{
    public class PluginClass2 : IPlugin
    {
        #region Secure/Unsecure Configuration Setup
        private string _secureConfig = null;
        private string _unsecureConfig = null;

        public PluginClass2(string unsecureConfig, string secureConfig)
        {
            _secureConfig = secureConfig;
            _unsecureConfig = unsecureConfig;
        }
        #endregion
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);

            try
            {
                //TODO: Do stuff
                #region 自定义代码
                if (context.MessageName.Equals("Create"))   
                {
                    switch (context.Stage)
                    {
                        case 20://创建 plugin step 的时候设置 create Pre-operation
                            CreatePreAction(tracer, context, service, factory);
                            break;
                        case 40://创建 plugin step 的时候设置 create Post-operation
                            CreatePostAction(tracer, context, service, factory);
                            break;
                        default:
                            break;
                    }
                }
                else if (context.MessageName.Equals("Update"))
                {
                    switch (context.Stage)
                    {
                        case 20://创建 plugin step 的时候设置 update Pre-operation
                            UpdatePreAction(tracer, context, service, factory);
                            break;
                        case 40://创建 plugin step 的时候设置 update Post-operation
                            UpdatePostAction(tracer, context, service, factory);
                            break;
                        default:
                            break;
                    }
                }
                #endregion
            }
            catch (Exception e)
            {
                throw new InvalidPluginExecutionException(e.Message);
            }
        }

        #region 自定义函数
        private void CreatePreAction(ITracingService tracer, IPluginExecutionContext context, IOrganizationService service, IOrganizationServiceFactory factory)
        {
            //创建当前 entity 时,在存到数据库之前调用
            Entity entity = (Entity)context.InputParameters["Target"];
        }

        private void CreatePostAction(ITracingService tracer, IPluginExecutionContext context, IOrganizationService service, IOrganizationServiceFactory factory)
        {
            //创建当前 entity 时,在存到数据库之后调用
        }

        private void UpdatePreAction(ITracingService tracer, IPluginExecutionContext context, IOrganizationService service, IOrganizationServiceFactory factory)
        {
            //更新当前 entity 时,在存到数据库之前调用
        }

        private void UpdatePostAction(ITracingService tracer, IPluginExecutionContext context, IOrganizationService service, IOrganizationServiceFactory factory)
        {
            //更新当前 entity 时,在存到数据库之后调用
        }
        #endregion
    }
}
View Code

相关文章:

  • 2022-12-23
  • 2021-08-28
  • 2022-12-23
  • 2021-05-23
  • 2021-06-09
  • 2021-08-01
  • 2022-03-03
  • 2022-12-23
猜你喜欢
  • 2021-06-10
  • 2022-12-23
  • 2021-08-12
  • 2021-07-10
  • 2022-02-13
  • 2022-12-23
相关资源
相似解决方案