• Dynamics CRM


           在 Dynamics CRM 开发中,我们可以使用 JavaScript 在前端对 Entity Form 进行数据操作,与此同时,我们也可以使用 C# 写后台插件,其中就包括了 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 上被调用了。

    图2.1 注册 Plug-in 程序集

          Workflow Class: 

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

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

    注册 Workflow 程序集

    图2.2 注册 Workflow 程序集

    图2.3 创建 workflow 组件

    图2.4 workflow 组件与 BPF

    图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

          Workflow Class:

    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Workflow;
    using System;
    using System.Activities;
    
    namespace CRMPluginProject_Test
    {
        public class WorkflowClass1 : CodeActivity
        {
            protected override void Execute(CodeActivityContext executionContext)
            {
                ITracingService tracer = executionContext.GetExtension<ITracingService>();
                IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
                IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
    
                try
                {
                    Entity entity = service.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new Microsoft.Xrm.Sdk.Query.ColumnSet(true));
    
                    //TODO: Do stuff
    
                    #region 自定义代码
                    //通过 workflow 创建一个 task
                    tracer.Trace("Start to create Task");
                    if (string.IsNullOrEmpty(entity["new_name"].ToString()))
                    {
                        Entities.Task task = new Entities.Task();
                        task.Subject = "task: " + entity["new_name"].ToString();
                        task.Description = "try to ceate a task";
                        task.RegardingObjectId = new EntityReference(entity.LogicalName, entity.Id);
                        service.Create(task);
                    }
                    #endregion
                }
                catch (Exception e)
                {
                    throw new InvalidPluginExecutionException(e.Message);
                }
            }
        }
    }
    View Code
  • 相关阅读:
    AX2009使用NPOI导出EXCEL颜色设置
    AX2009使用NPOI导出EXCEL常用格式设置
    AX2009使用NPOI导出EXCEL2007
    AX2009使用NPOI导出EXCEL
    【基础复习】五:STL模板与容器
    【基础复习】四:循环、递归与概率
    【基础复习】三:指针与引用
    【基础复习】二:预处理、const与sizeof
    【基础复习】一:程序设计基本概念
    TEC-2 机 微程序设计
  • 原文地址:https://www.cnblogs.com/Sunny20181123/p/10870480.html
Copyright © 2020-2023  润新知