【转】Dynamics 365中开发和注册插件介绍

7 篇文章 0 订阅
订阅专栏

是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复380或者20191124可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

前面的博文讲了些客户端编程,但是对于重要的数据,一般需要服务器端再做一次校验,常用的手段就是插件和实时工作流,今天我讲一下插件,官方文档请参考 Write a plug-in 和  Register a plug-in 等。

首先需要创建一个 .NET Framework 的 Class Library项目,记得 Framework选择 .NET Framework 4.6.2 。当然,为不同版本的Dynamics 365 Customer Engagement选择的Framework不尽相同,请根据官方文档说明,我这个示例是为 V9.X 版本做的示例。

 

 

首先通过NuGet添加对Microsoft.CrmSdk.CoreAssemblies的引用,如下图,当然也要选择合适的版本。如果不能上网的话,就需要添加对 Microsoft.Xrm.Sdk.dll 和 Microsoft.Crm.Sdk.Proxy.dll 的引用。

 

 

一般我会删除生成的Class1.cs文件,而是使用固定的命名方式来命名。比如我这个插件步骤将会注册在ly_WorkOrder实体的Create消息的Pre阶段,我就会新建一个 PreWorkOrderCreate.cs 的文件来撰写业务逻辑,当然这个类必须继承 Microsoft.Xrm.Sdk.IPlugin 接口,我使用的代码如下:常见的是获取组织服务和跟踪服务,其中插件日志的使用请参考我的博文: Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy! ,若要使用映像(Image),请参考我的博文: Dynamics 365 CE Update消息PostOperation阶段Image的尝试  和   Dynamics 365 CE在Pre Delete插件中应用Image 。记得若要抛出用户可见可理解的异常文本,请使用throw new InvalidPluginExecutionException。

复制代码

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

namespace PluginDemo
{
    public class PreWorkOrderCreate : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            //获取日志服务
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            //写一些日志,方便跟踪
            tracingService.Trace($"Enter PreWorkOrderCreate on {DateTime.UtcNow.ToString()}");
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                //插件针对的当前实体记录,对于Pre Create来讲,该对象包括了所有设置的字段值,若字段没有设置值,在该对象中会不存在
                Entity currentEntity = (Entity)context.InputParameters["Target"];
                //获取组织服务
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService orgSvc = serviceFactory.CreateOrganizationService(context.UserId);
                int provinceValue = Int32.MaxValue;
                int cityValue = Int32.MaxValue;
                string buName = string.Empty;
                //首先获取要做校验的值
                //记得先确认该属性存在值再获取其值,否则容易引发异常
                if (currentEntity.Contains("ly_province"))
                {
                    provinceValue = currentEntity.GetAttributeValue<OptionSetValue>("ly_province").Value;
                }
                if (currentEntity.Contains("ly_city"))
                {
                    cityValue = currentEntity.GetAttributeValue<OptionSetValue>("ly_city").Value;
                }
                var userEntity = orgSvc.Retrieve("systemuser", context.UserId, new ColumnSet("businessunitid"));
                //每个系统用户肯定都设置了业务部门,我这里只是例行检查这个字段存在值
                if (userEntity.Contains("businessunitid"))
                {
                    buName = userEntity.GetAttributeValue<EntityReference>("businessunitid").Name;
                    if(buName == "Demo")
                    {
                        //省份字段用户选择了值才校验
                        if(provinceValue != Int32.MaxValue)
                        {
                            if(provinceValue != 430000)
                            {
                                throw new InvalidPluginExecutionException($"省份字段值选择有误!");
                            }
                            else
                            {
                                //城市字段用户选择了值才做校验
                                if(cityValue != Int32.MaxValue)
                                {
                                    if (cityValue >= provinceValue && cityValue < provinceValue + 10000)
                                    {
                                        tracingService.Trace($"城市字段选择了值,且属于正确的省份!");
                                    }
                                    else
                                    {
                                        throw new InvalidPluginExecutionException($"城市字段值选择有误!");
                                    }
                                }
                            }
                        }
                    }
                    else if(buName == "Sub Unit")
                    {
                        //省份字段用户选择了值才校验
                        if (provinceValue != Int32.MaxValue)
                        {
                            if (provinceValue != 440000)
                            {
                                throw new InvalidPluginExecutionException($"省份字段值选择有误!");
                            }
                            else
                            {
                                //城市字段用户选择了值才做校验
                                if (cityValue != Int32.MaxValue)
                                {
                                    if (cityValue >= provinceValue && cityValue < provinceValue + 10000)
                                    {
                                        tracingService.Trace($"城市字段选择了值,且属于正确的省份!");
                                    }
                                    else
                                    {
                                        throw new InvalidPluginExecutionException($"城市字段值选择有误!");
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    throw new InvalidPluginExecutionException($"系统异常,当前用户(userid={context.UserId})的业务部门没有设置!");
                }
            }
            tracingService.Trace($"Leave PreWorkOrderCreate on {DateTime.UtcNow.ToString()}");
        }
    }
}

复制代码

 

记得一定要给该插件/自定义工作流活动程序集签名,在Visual Studio中右击该项目,选择属性(Properties) >  签名(Signing),选中 Sign the assembly,我这里新建一个Key file。

 

 

Key file我的设置如下,为了简便,我就不设置密码保护了,保存后编译插件项目,确定没有编译错误。

 

 

然后需要使用插件注册工具将其注册到Dynamics 365中,工具的下载请参考我的博文  下载Dynamics 365 Customer Engagement 工具 。双击其中的 PluginRegistration\PluginRegistration.exe 文件。点击【CREATE NEW CONNECTION】,以便连接到Dynamics 365,下面这个截图是连接到我自己的做了面向互联网部署(IFD)的环境示例。

 

 

如果是连接到Dynamics 365 Customer Engagement Online,请参考下图:

 

 

点击【Register】 > 【Register New Assembly】。

 

 

 

选择前面步骤编译生成的插件程序集,Isolation Mode一般建议选择Sandbox,而且Dynamics Customer Engagement Onine也只能选择Sandbox,强烈建议选择存储到Database,点击【Register Selected Plugins】按钮,如果看不到该按钮,是你的电脑分辨率太低所致,就用Tab键盘来辅助操作吧。

 

 

如果没有错误的话会弹出类似如下对话框:

 

 

还需要右击创建的Plugin,选择【Register New Step】按钮。

 

 

我这里设置如下,是注册在lw_workorder的Create消息的PreOperation阶段,其余的就不一一解释了,请参考官方文档,点击【Register New Step】按钮。

 

 

注册成功后可以看到最终的结果类似如下:

 

 

剩下的工作就是测试了,使用InvalidPluginExecutionException抛出的异常信息在界面显示效果如下:

Dynamics365编写和注册插件(一)
qq_55069674的博客
03-08 1618
Dynamics365编写和注册插件
Dynamics 365 插件开发案例:查询、增加、修改和删除操作
hy_4377的博客
08-01 533
Dynamics 365插件是一种非常强大的扩展机制,允许开发人员在特定事件发生时执行自定义业务逻辑。本文将介绍如何在Dynamics 365插件实现对不同类型字段的查询、增加、修改和删除操作,涉及的字段类型包括:文本、选项集、两个选项、日期、金额、十进制、浮点数、查找字段等。
Microsoft Dynamics 365软件二次开发Dynamics365插件开发与消息处理
最新发布
kkchenjj的博客
08-23 1033
自定义实体插件用于在自定义实体的创建、更新或删除时执行特定的业务逻辑。
Dynamics 365应用程序开发-2.使用应用程序模块设计器设计Apps
Martin-Mei的博客
09-03 465
Apps是Dynamics 365引入的一项新功能,为用户提供快速导航,以便快速访问最相关的实体,等等。Apps很方便,每个App都有自己的网站地图。在Dynamics365设计站点地图的详细信息将在第1章“自定义应用程序导航”讨论。简而言之,站点地图是一个存储导航链接的组件,并以XML格式内部存储在Dynamics365。实体仪表板表单视图图表业务流程在上一节,我们发布了一个名为Lead Generation的新的自定义应用程序。
Dynamics CRM 365 - 零基础入门学习后端插件注册方法
Little Monkey的博客
11-16 959
Dynamics CRM 365 - 零基础入门学习后端插件注册方法 在Dynamics 365我们如使注册我们定义好的插件呢? 注册插件Dynamics CRM 365 - 零基础入门学习后端插件注册方法插件注册1、打开插件注册工具,输入相关信息。2、生成已写好的类库,并如下图所示点击注册3、选择我们的插件进行勾选注册4、为注册好的插件类库添加步骤。4.1 Message4.2 Primary entity4.3 Filtering Attributes4.4 Execution Order4.4
Dynamics 365 Plugin插件操作方式
Stodger0216的博客
11-30 1256
一、项目配置 二、授权 三、注册DLL 四、注册步骤
Dynamics 365应用程序开发- 8.利用Dynamics 365的Azure扩展
Martin-Mei的博客
09-06 944
Azure服务总线可以定义为在Microsoft的Azure数据运行的云消息服务。Azure服务总线使我们能够连接托管在云或防火墙网络内的内部部署的不同应用程序、服务或设备。它可以用于连接不同的业务线(LOB)应用程序、平板电脑、手机,甚至任何家用电器或传感器。此Azure服务总线支持两种不同的通信机制:代理消息传递(队列、主题和订阅)和继服务。Azure服务总线代理的消息传递功能包括可以在Microsoft的Azure数据创建和托管的队列和主题。
Microsoft Dynamics 365软件二次开发Dynamics365开发环境搭建与配置
kkchenjj的博客
08-22 846
在Microsoft Dynamics 365,自定义页面是实现业务需求的关键步骤。这包括创建自定义实体、调整现有实体的视图、以及构建完全自定义的Web资源。假设我们有一个销售订单实体,我们想要添加一个自定义按钮来计算订单的总金额。首先,我们需要在实体上添加一个按钮,然后编写JavaScript代码来调用Web API。
Microsoft Dynamics 365软件二次开发Dynamics365二次开发案例分析与实战
kkchenjj的博客
08-23 1046
Xrm.js是Dynamics 365提供的一套JavaScript库,用于在客户端进行二次开发。它提供了访问Dynamics 365数据、控制用户界面、处理事件等功能。在Dynamics 365,实体是数据模型的基本单位,属性是实体的组成部分。自定义实体和属性是二次开发常见的需求,以适应特定的业务场景。登录Dynamics 365:使用管理员账户登录。打开解决方案:在“解决方案”,选择“新建”。添加自定义实体:在解决方案,选择“实体” > “新建”。定义实体属性。
创建一个dynamics 365 CRM online plugin (九) - Context.Depth
weixin_30687587的博客
04-25 328
让我们来看看官方文档是怎么讲的https://docs.microsoft.com/en-us/previous-versions/dynamicscrm-2016/developers-guide/gg326836(v=crm.8) Every time a running plug-in or Workflow issues a message request to the Web ser...
DYNAMIC365开发参考
12-29
ExtendingMicrosoftDynamics365forOperationsCookbook
Dynamics 365: 详解插件的执行深度(PluginExecutionContext.Depth)
06-11 1288
Depth这个属性会告诉你插件它在一个调用堆栈有多深,是第几次被调用。1. 首先我们写一个Account实体插件并用到RetrieveMultiple事件,就是当我们每次点进Accont的一个视图的时候都会调用这个RetrieveMultiple事件,但里面只是记了一条log而已: 2. 当我们每次点进Accont的一个视图的时候都会触发这个事件,我们通过Plug-in Trace Log可以看出,在这次的事务它只执行了一次,因为Depth为1.3. 我们将代码进行如下修改,判断一下Depth的值,
Dynamics 365 CRM插件编写
R·ZORO的博客
06-26 414
Dynamics CRM 365插件编写
Dynamics 365 插件开发教程
hy_4377的博客
07-29 1279
插件Plugin)是 Dynamics 365 一种非常强大的扩展机制,可以在系统实现自定义的业务逻辑。插件是在服务器端运行的代码,能够在特定事件发生时被触发,例如创建、更新或删除记录时。本文将介绍如何在 Dynamics 365 开发插件
Dynamics CRM插件开发及调试
weixin_30347335的博客
05-23 1375
本文介绍Dynamics CRM插件开发插件调试 工具:VS2015、Developer Toolkit for Microsoft Dynamics 365PluginRegistration 需求:我需要用插件开发的方式给客户实体的客户编码字段赋值 步骤一:首先需要下载安装Developer Toolkit for Microsoft Dynamics 365工具,安装完成后在VS...
Dynamics 365: 从0到1了解如何创建Custom API(3) - Custom API的调试之插件调试
05-07 386
从0到1了解如何创建Custom API(3) - Custom API的调试之插件调试
Dynamics 365: 从0到1了解如何创建Custom API(2) - Custom API与插件关联
05-05 452
这次我们主要写一个插件,与我们之前创建的Custom API进行关联。
Dynamics 365 开发最佳实践思考
一只不知疲倦的学习猿
07-04 876
Dynamics 365开发最佳实践思考
写文章

热门文章

  • Ubuntu下安装Chrome浏览器的两个方法 220229
  • 什么是欧拉角/姿态角? 99698
  • Windows电脑SMB共享设置方法 85740
  • 【转】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问 64478
  • 最新的windows xp sp3序列号 xp序列号 39126

分类专栏

  • vba4 4篇
  • DCMTK 8篇
  • vba81
  • 乔克灬叔叔 1篇
  • 菜鸟入门篇-PACS客户端 3篇
  • QT 16篇
  • CPP 31篇
  • CT 14篇
  • CE 1篇
  • CT窗_层_面_概念 5篇
  • 未分类 80篇
  • CAN 2篇
  • Win32 21篇
  • VTK 6篇
  • vtk用户指南
  • VTK修炼之道 2篇
  • DICOM 32篇
  • zssure 8篇
  • fo-DICOM 3篇
  • Dicom 学习笔记 7篇
  • DICOM入门 3篇
  • DICOM网络协议 5篇
  • csharp 66篇
  • CLR 18篇
  • 国密加密 8篇
  • 常见类继承关系 1篇
  • C# stream 5篇
  • 带你玩转Visual Studio 4篇
  • C#的三种异步的详细介绍及实现 4篇
  • NameSpace 及命名规范 8篇
  • 文件操作 6篇
  • 异步编程系列 27篇
  • 分层架构实战 2篇
  • c#变迁史 11篇
  • Log4Net 1篇
  • Visualstudio 29篇
  • 集合接口 7篇
  • 同步与异步系列之二 8篇
  • c#进阶 15篇
  • 各类锁 5篇
  • ASP.NET MVC 入门 15篇
  • ASP.NET Core管道深度剖析 6篇
  • IIS管道 17篇
  • 单元测试 5篇
  • 多线程系列 49篇
  • C#多线程之旅 12篇
  • WebForm 14篇
  • WebApi系列 25篇
  • WebService 4篇
  • WebSocket 12篇
  • 阿里技术专家详解 DDD 系列 2篇
  • 逆变与协变 4篇
  • DotNet进阶 22篇
  • 你必须知道的.NET 37篇
  • Quartz.Net详解 14篇
  • net框架 13篇
  • abp 17篇
  • ABP分析 48篇
  • ABP入门系列 20篇
  • 不知道 11篇
  • Entity FrameWork详解 28篇
  • NuGet 12篇
  • 同步异步系列 22篇
  • WCF 3篇
  • WPF 21篇
  • C#Socket编程详解 1篇
  • CLRProfile 2篇
  • 通用知识 2篇
  • 刨根究底字符编码 21篇
  • 刨根究底正则表达式 2篇
  • Postman系列 6篇
  • TCP_IP 7篇
  • svn 6篇
  • 人工智能 5篇
  • Office 365开发入门指南 2篇
  • Microsoft Teams快速上手系列 5篇
  • OData 6篇
  • Git 10篇
  • Dynamics365 8篇
  • XRM 7篇
  • D365 FO第三方集成 6篇
  • Dynamics 365 目录 5篇
  • Dynamics CRM 365零基础入门学习 9篇
  • 蜗牛星际 4篇
  • RPA 1篇
  • 笔记 2篇
  • 数据库 4篇
  • Access
  • SQLServer 16篇
  • MySql 10篇
  • Oracle
  • 分布式事务 17篇
  • Quenue 1篇
  • RabbitMQ六种队列模式 5篇
  • MemCached
  • Redis 4篇
  • MonogoDB 2篇
  • HBASE
  • Neo4j
  • 软件工程 10篇
  • CI_CD 2篇
  • 状态机 7篇
  • Axure RP 11篇
  • 消息队列 2篇
  • AOP 3篇
  • 设计原则 2篇
  • 设计模式 6篇
  • CSharp23设计模式 26篇
  • 白话设计模式 28 讲 2篇
  • Scrum 3篇
  • 软件模式 1篇
  • UML 13篇
  • 系统架构 1篇
  • 三高 1篇
  • 认证考试 1篇
  • Ali云 1篇
  • Cloudera 1篇
  • 微软认证 4篇
  • 前端 14篇
  • Magento 8篇
  • VUE 2篇
  • 刨根究底CSS 2篇
  • EasyUI学习总结(一) 1篇
  • 14-JS系列 6篇
  • 13-CSS系列 14篇
  • knockoutjs 8篇
  • razor 1篇
  • sharepoint 133篇
  • SP学习笔记—架构系列 13篇
  • SP学习笔记—ECM系列 4篇
  • SP学习笔记—Ribbon系列 1篇
  • SP学习笔记—Site Definition系列 4篇
  • SP无代码开发实例 3篇
  • SP学习札记 6篇
  • SharePoint服务器端对象模型 15篇
  • tfs 41篇
  • MTM 4篇
  • network 10篇
  • 天猫精灵 2篇
  • 一步步编写操作系统 83篇
  • linux 48篇
  • azure 29篇
  • MicrosoftGraphic 16篇
  • Azure手把手系列 6篇
  • onedriver 8篇
  • 云安全 17篇
  • Azure Sentinel 18篇
  • python 2篇
  • vc 15篇
  • Windows 6篇
  • Office 1篇
  • PowerBI 8篇
  • Ros 34篇
  • 由浅到深理解ROS 10篇
  • TurtleBot3 4篇
  • vba1 6篇
  • masm 84篇
  • Java 61篇
  • Java Web 5篇

最新评论

  • 【转】WPF单位真的与分辨率无关吗?

    m0_53249589: 非常感谢,解决了新手的疑惑

  • VS的包含目录、库目录、引用目录、可执行目录解释

    踏过山河,踏过海: 引用目录:?

  • 【转】vivado18.3的安装 安装教程

    Vemon?: 你有问题

  • 【转】重新打包DebianISO实现无人应答安装(UEFI+BIOS)

    xs53868059: 大佬,请教下, 这个过程需要联网吗, 没有网的环境可以用不

  • 【转】vivado18.3的安装 安装教程

    sinolover: cn.bing.com 还是很多的

大家在看

  • 从0到1!萌新跟着操作也能学会的保姆级全栈项目开发实录一:项目初始化配置 1974
  • Android 13 SPRD 如何临时修改 Android 系统版本 2
  • C语言 | Leetcode C语言题解之第500题键盘行 140
  • 程序查询以及软件硬件 80
  • P26 神经网络-完整的模型训练套路

最新文章

  • Visual Studio Code c++函数跳转时显示“未找到函数定义” vscode no definition for 鼠标提示也没有
  • excel 人民币中文大写转换无宏完美版
  • 脚本:自动修改wsl中主机Host的IP
2023年5篇
2022年49篇
2021年394篇
2020年905篇
2019年450篇
2018年2篇
2017年21篇
2014年3篇

目录

目录

分类专栏

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家浙江公园玻璃钢雕塑哪家便宜广州玻璃钢仿铜雕塑公园玄武商场主题美陈贵州方形玻璃钢花盆乌苏玻璃钢雕塑蕲春玻璃钢造型雕塑狗年商场春节美陈玻璃钢艺术雕塑销售烟台人物玻璃钢雕塑玻璃钢雕塑设计素描南京仿铜玻璃钢雕塑贵州动物玻璃钢雕塑定制河南标识玻璃钢景观雕塑定做山东玻璃钢雕塑招聘日照人物玻璃钢雕塑制作玻璃钢成品雕塑定做浙江开业商场美陈厂家直销天津广场玻璃钢雕塑定做广东省大型玻璃钢雕塑上海定制玻璃钢雕塑省钱深圳周年庆典商场美陈上海佛像玻璃钢雕塑价位唐山玻璃钢革命人物雕塑张掖仿真人物玻璃钢雕塑定做西安现代人物玻璃钢雕塑昆明马鞍山玻璃钢人物雕塑红色玻璃钢卡通雕塑商家重庆人物玻璃钢雕塑周年商场美陈哪里买郑州标识标牌玻璃钢雕塑定做厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化