实施Microsoft Dynamics 365 CE-7.扩展Dynamics 365 CE,包括为Dynamics 365 CE应用程序编写代码。

本章将帮助您了解如何使用自定义代码扩展Dynamics365CE的行为。我们将了解Dynamics365CE的可扩展性架构以及可以扩展Dynamics365 CE的层。我们将讨论如何为实体表单和字段编写客户端代码。我们还将讨论使用Web API代码检索实体数据的选项。稍后,我们将讨论插件开发的细节,例如编写插件程序集、注册插件程序集和调试插件代码,以使用服务器端代码实现我们的自定义逻辑。调试插件将帮助您解决插件开发中的任何问题。

我们将在本章中讨论的主要主题如下:

  • 可扩展性架构
  • 实现客户端逻辑
  • 实现服务器端逻辑
  • 使用插件实现自定义逻辑
  • 调试插件代码

技术要求

以下是本章的技术要求:

  • 访问Dynamics 365 CE或内部部署环境。
  • 应安装.NET Framework 4.6.2或更高版本。
  • 应安装Visual Studio 2012或更高版本。
  • Windows Identity Foundation 3.5应该安装在您的开发计算机上。
  • 应下载Dynamics 365 CE插件注册工具。

可扩展性体系结构

Dynamics365CE应用程序是众所周知的高度可扩展的业务应用程序。它的可扩展性平台为我们提供了许多扩展Dynamics 365 CE功能的选项,如自定义业务实体或创建新实体、编写客户端扩展、开发自定义插件等。在第6章“自定义Dynamics 365 CE”中,我们讨论了自定义实体和视图以及创建新的业务实体、字段、表单,以及无需任何编码的站点地图。我们还讨论了解决方案概念,它使我们可以轻松地将更改从一个环境转移到另一个环境。

Dynamics 365 CE的另一个伟大功能是它支持用JavaScript、jQuery、HTML和.NET等常用语言编写代码。我们还可以在Dynamics 365 CE之外编写自定义组件,同时利用Dynamics 365 CE API进行集成。我们在Dynamics 365 CE API中提供了不同的方法和功能,可以与其他第三方应用程序集成。

我们可以使用下图来理解Dynamics 365 CE的可扩展性架构:

如您所见,我们可以将Dynamics 365 CE体系结构图分为以下三层:

  • 表示层
  • 平台层
  • 数据库层

表示层

我们可以在上图中看到的第一层是表示层,它负责为用户提供访问Dynamics365CE的接口。这个层提供了许多我们可以扩展的点。让我们看看这个层中包含的所有项目。

客户端扩展

在第6章“自定义Dynamics365CE”中,在讨论自定义时,我们了解了如何自定义站点地图。通过更改网站地图,我们可以提供为最终用户提供个性化体验。我们可以删除客户不需要的站点地图区域。例如,如果销售部门只使用销售区域,则可以对该部门隐藏其他区域。Dynamics 365 CE现在允许我们创建自定义应用程序,这些应用程序也可用于为用户定义量身定制的应用程序。

业务实体组件

我们在第6章“自定义Dynamics365CE”中了解了实体及其组件。如果需要,我们可以创建自定义实体。一旦创建了自定义实体,Dynamics 365 CE平台就会向该实体添加开箱即用的组件,如主窗体、视图和字段。这些组件可以根据我们的需求进行定制,我们还可以添加新的表单、视图和字段。

命令和功能区按钮

实体窗体和视图上有不同的命令按钮。我们可以使用这些命令按钮来启动不同的操作。所有新表单(也称为更新表单)都包含命令按钮,而所有旧表单仍然包含功能区按钮。在下面的屏幕截图中,我们可以看到实体表单和子网格的命令按钮:

我们可以通过修改RibbonDiffXml来添加新的命令按钮或修改现有的命令按钮:

我们可以通过将我们的解决方案(应该包括我们的实体)导出到我们想要添加新的自定义命令按钮的位置来手动自定义RibbonDiffXML。但是,手动添加命令按钮可能容易出错,因此建议使用工具快速添加命令按钮。Dynamics365CE社区中流行的工具之一是RibbonWorkbench。该工具引用了我们的解决方案,并通过简单地使用命令按钮编辑器上的拖放控件来修改功能区定义。确保将您的解决方案组件保持在最低限度;否则,自定义和发布更改可能会很耗时。

您可以从下载Ribbon Workbench:Develop 1 Ltd | Ribbon Workbench for Dynamics 365 & Dynamics CRM

有关使用Ribbon Workbench编辑器的详细信息,请访问

1 - Getting started with the Ribbon Workbench – Ribbon Workbench for Dynamics CRM/365 & Power Platform

我们还可以使用XrmToolBox中的Ribbon工作台。您可以在

Ribbon Workbench 2016 · XrmToolBox

Web 资源

扩展Dynamics365CE功能的另一种方法是使用web资源。Web资源是不同类型的文件,如XML、HTML、JavaScript、CSS和图像。我们可以将这些网络资源用于不同的目的:我们可以使用HTML网络资源来创建自定义屏幕;JavaScript web资源用于存储客户端代码;CSS文件可用于存储样式表;并且图像网络资源可以用于存储不同格式的图像文件。

Dynamics 365 CE支持以下web资源类型:

Web资源存储在Dynamics365CE中,可以通过其唯一的URL进行引用。我们将在本章的创建网络资源部分使用网络资源。

商业智能扩展

尽管Dynamics 365 CE提供了许多现成的报告、仪表板和图表,但如果需要,我们可以在Visual Studio或在Dynamics365CE应用程序本身中开发它们。我们可以为Dynamics 365 CE开发两种类型的报告,如下所示:

  • FetchXML:FetchXML报告是为Dynamics365CE在线开发的,我们用类似XML的语法编写查询,即FetchXML。
  • SQL Server Reporting Services(SSRS):这些报告是为Dynamics 365 CE内部部署开发的,我们可以在其中使用SQL编写查询。

我们将在第9章“商业智能和报告”中详细讨论报告。

自定义应用

Dynamics 365 CE提供了丰富的API支持,可用于将自定义应用程序与Dynamics 365 CE集成。我们可以使用Microsoft或非Microsoft语言工具开发自定义web或Windows应用程序。

平台层

可扩展性体系结构图中的平台层表示许多组件,例如Dynamics365CE web服务和使用插件的自定义业务逻辑。让我们逐一讨论这些组件。

Dynamics 365 CE web服务

Dynamics 365 CE提供了许多API,我们可以在自定义应用程序中使用这些API来连接Dynamics 365 CE数据。我们有以下适用于Dynamics 365 CE的API,我们将在以下小节中介绍这些API:

  • Web API
  • 组织服务
  • 发现服务
Web API

这是Dynamics CRM 8.0版中引入的一组新API。在早期版本的Dynamics CRM中,如2016及更早版本,开发人员曾使用SOAP端点连接到Dynamics CRM数据。使用SOAP,通过.NET应用程序连接很容易,但对于非.NET应用程序,连接起来很困难。后来,引入了REST API,使非.NET应用程序能够轻松地与DynamicsCRM数据连接。此REST API也称为OData端点。

尽管使用REST API很容易连接到Dynamics CRM数据,但它仅为我们提供了一组有限的方法来使用Dynamics CRM数据。为了克服这一限制,在Dynamics CRM 8.0版中引入了一个新的Web API,使.NET和非.NET应用程序可以轻松地连接数据,并提供了一整套方法。在不久的将来,Web API也将取代Dynamics365CE组织的服务。我们将在本章的“使用Web API”部分中讨论有关Web API的更多详细信息。

组织服务

这是我们可以使用Dynamics 365 CE数据和元数据的另一项服务。我们可以在Dynamics 365 CE之外的应用程序中使用组织服务,并且可以执行不同的操作。它包含不同的请求,如创建、更新、检索、检索多个和删除。将来,此服务将被Web API所取代。我们将在后面的章节中讨论本组织服务中可用的方法。

发现服务

Dynamics365CE是一个多租户业务应用程序,这意味着,在一个租户中,我们可以设置多个组织。在在线环境的情况下,我们可以创建不同的组织,如Dev、QA和Prod,用作我们的开发、测试和生产环境。如果使用发现服务创建了多个组织,我们可以为用户获取正确的端点URL。

插件程序集

Dynamics 365 CE允许我们使用.NET程序集注册自定义服务器端业务逻辑。我们可以在不同的触发器上编写插件,这些插件可以在主数据库操作之前或之后运行。插件是扩展Dynamics365CE行为最常用的方法之一。我们将在使用插件实现自定义逻辑一节中更详细地讨论插件。

自定义工作流程序集

Dynamics 365 CE为工作流提供了丰富的支持,主要面向业务用户。工作流提供了最常用的触发器和操作,我们可以使用它们来执行不同的任务,如创建和更新记录、发送电子邮件和分配记录。但除此之外,我们还可以编写自定义工作流程序集来扩展工作流的功能。

业务实体

我们知道Dynamics 365 CE有许多现成的域特定实体可用,但如果需要,我们可以创建自定义实体,这使我们能够扩展Dynamics 365 CE的业务实体集合。我们在第6章“自定义Dynamics365CE”中讨论了实体的创建。

数据库层

此层对Dynamics 365 CE用户隐藏,并负责存储其他层的客户数据和组织数据。我们无法直接更改Dynamics 365 CE数据库(尽管这在技术上是可能的,但它不受支持,也不记录在Dynamics 365 CE SDK中)。Dynamics 365 CE有两个主要数据库:

  • 配置数据库
  • 组织数据库

配置数据库

此数据库存储Dynamics 365 CE的元数据。此数据库是在设置Dynamics 365 CE环境时创建的。例如,如果您在本地安装Dynamics 365 CE,则此数据库将与Dynamics 365 CE组织数据库一起创建。但是,如果使用部署管理器创建新组织,它将不会再次创建配置数据库;相反,它将重用现有的配置数据库。此数据库将以名称MSCRM_Config创建。

组织数据库

该数据库存储客户数据,是为每个组织创建的。例如,如果我们创建了三个组织,即Dev、QA和Prod,那么每个组织将有三个数据库。每个数据库都是根据组织的名称创建的;例如,如果我们的Dev组织名称为HIMBAPDev,那么组织数据库的名称将为HIMBAP Dev_MSCRM。此数据库包含Dynamics 365 CE中每个实体的表。组织数据库还包含每个实体的一个特殊视图,称为筛选视图。此视图根据用户的安全角色显示数据。为Dynamics 365 CE创建的所有报告都使用这些视图。

在此基础上,我们讨论了Dynamics 365 CE的所有层,还讨论了使我们能够增强Dynamics 365 CE能力的所有扩展点。现在,让我们详细讨论所有这些扩展点。首先,我们将讨论在Dynamics365CE中实现客户端逻辑。

实现客户端逻辑

客户端逻辑在客户端机器上执行;例如,使用客户端代码实现的数据验证在浏览器中运行。Dynamics365CE允许我们使用客户端语言工具,如JavaScript的jQuery来实现客户端逻辑。我们可以在实体窗体上使用客户端代码来实现数据验证或显示来自其他实体的数据。要实现实体的客户端逻辑,首先,我们需要了解客户端API对象模型。我们可以使用以下图表来完成此操作:

如上图所示,我们在客户端API对象模型根下有四个主要上下文。

executionContext

执行上下文用于获取有关代码执行位置的上下文。在为实体窗体编写客户端代码和为窗体编写控件时,我们可以传递此参数以获取上下文。我们可以使用下面两小节中解释的选项将executionContext传递给我们的代码。

使用事件处理程序

要将事件处理程序添加到实体表单字段,我们可以双击特定的实体字段,然后单击事件列表下的添加按钮。在将可能的事件与控件关联时,我们可以启用Pass执行上下文作为第一个参数选项,如下所示:

此外,在我们的代码中,我们可以使用这个执行上下文。如果在“事件”选项卡下选择了此选项,则我们只能使用诸如formContext之类的上下文,但如果未启用此选项,并且我们尝试使用formContext,则会出现错误。

在代码中使用事件处理程序

有时,我们需要使用JavaScript代码将事件与实体字段相关联。在这些情况下,执行上下文会自动作为第一个参数传递给函数。
例如,假设我们有一个名为“amount”的字段,当用户更改该字段的值时,我们希望执行一个函数。为了实现这一要求,我们可以使用以下代码:

formContext.getAttribute("him_amount").addOnChange(amountOnChange);
我们可以使用前面的代码将OnChange事件与此字段相关联。通过这样做,执行上下文将自动传递给amountOnChange函数。

formContext

这是最常用的上下文,允许我们访问实体窗体和实体窗体控件。在早期版本中,我们使用Xrm.Page来获取实体窗体及其控件。随着Dynamics365CE版本9的发布,Xrm.Page已被弃用,我们现在使用formContext。formContext包含许多我们可以用来访问不同控件的对象。

使用下图,我们可以理解所有这些对象:

正如您所看到的,在formContext下,我们主要有两个对象:data和ui。让我们逐一详细讨论这些对象。

data

这个对象允许我们主要使用实体数据。在数据下,我们有三个对象。

attributes

此对象用于处理集合,并且仅在新的统一接口客户端中受支持。

entity

此对象帮助我们处理当前实体记录;例如访问实体属性。以下方法在此对象下可用:

addOnSave
我们可以使用此方法来调用保存实体表单时的特定函数。我们可以使用以下方法:
formContext.data.entity.addOnSave(accountOnSave)
getDataXml
我们可以使用此方法来查找实体表单上更新的字段。此方法为我们提供了一个XML字符串,我们可以在其中查看将保存到Dynamics 365 CE数据库的字段:
formContext.data.entity.getDataXml();
getEntityName
如果我们想使用客户端代码了解当前实体的逻辑名称,我们可以使用此方法。例如,如果我们在车辆实体中使用以下代码,它将返回him_vehicle:
formContext.data.entity.getEntityName()
getEntityReference

我们可以使用此方法来获取查找引用。我们可以在以下代码中使用它:
formContext.data.entity.getEntityReference();
此方法返回一个包含以下三个属性的对象:

  • entityType:实体的逻辑名称
  • id:实体记录的GUID
  • name:实体的主字段值
getId
此方法可用于获取当前记录的GUID:
formContext.data.entity.getId();
getIsDirty
如果我们想知道表单中是否有任何字段值发生了更改,我们可以使用此方法。我们可以使用以下代码:
formContext.data.entity.getIsDirty();
getPrimaryAttributeValue
正如我们所知,每个实体都有一个文本类型的主字段。如果我们想获得主字段的值,我们可以使用以下代码:
formContext.data.entity.getPrimaryAttributeValue();
isValid
此方法可用于查明是否所有实体字段数据都有效:
formContext.data.entity.isValid();
removeOnSave
如果我们想删除保存实体表单的函数,我们可以使用以下代码:
formContext.data.entity.removeOnSave(accountOnSave);
save
此方法用于保存实体记录。保存方法有一个不同的参数,我们可以在其中定义是关闭实体窗体还是在保存后打开新的实体窗体:
formContext.data.entity.save(saveOption);
例如,如果我们想在保存后打开一个新的实体表单,我们可以使用以下代码:
formContext.data.entity.save(“saveandnew”);

我们可以使用前面的方法与Dynamics365CE实体进行交互。

process

该对象提供了一些方法,以便我们能够处理业务流程流。业务流程流用于指导用户如何通过遵循业务流程流中的不同步骤和阶段来完成预定义流程。此对象下提供以下常用方法:

我们可以使用前面的方法根据我们的需求与业务流程流进行交互。

ui

此对象内部包含其他对象,这些对象提供的方法主要用于使用Dynamics365CE用户界面。让我们回顾一下在这个对象下可用的方法。

控件

此对象允许我们使用Dynamics 365 CE中可用的不同控件。以下是此对象下可用的常用标准控制类型方法:

addNotificati
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Martin-Mei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值