练习 - 编写您的第一个插件

已完成

在本应用场景中,组织需要确保以一致的格式输入电话号码数据。 为了实现这一目标,您将创建一个在创建/更新时运行的插件,该插件在将电话号码保存到 Dataverse 之前,会从电话号码中去除所有非数字字符。 然后,您将创建另一个插件,该插件将在联系人检索/检索多个时运行,以重新格式化电话号码,使其包含括号和破折号(如果数据存在)。 

练习 1:创建/更新插件

在本练习中,您将创建一个插件,该插件将在创建和更新时运行。 本插件将从电话号码中去除所有非数字字符。

每个练习都包括应用场景和学习目标。 应用场景描述了练习的目的,同时列出了目标并具有要点。

注意

如果您没有 Dynamics 365 SDK 工具,请参阅从 NuGet 下载工具进行下载。

任务 1:创建插件

  1. 启动 Visual Studio 2022。

  2. 选择文件 > 新建 > 项目

  3. 选择类库 (.NET Framework),然后选择下一步

  4. 输入 D365PackageProject 作为项目名称,选择保存项目的位置,选择 .NET Framework 4.6.2 作为框架,然后选择创建

  5. 右键单击项目,然后选择管理 NuGet 包

  6. 选择浏览选项卡,搜索并选择 microsoft.crmsdk.coreassemblies,然后选择安装

  7. 阅读许可条款,如果同意,请选择接受

  8. 关闭 NuGet 包管理器。

  9. 右键单击 Class1.cs,然后单击删除

  10. 右键单击项目,然后选择添加 > 类

  11. 命名新类 PreOperationFormatPhoneCreateUpdate,然后选择添加

  12. 将 using 语句添加到新类中,如下所示:

     using Microsoft.Xrm.Sdk;
    
     using System.Text.RegularExpressions;
    
  13. 将该类设为公共类,并实施 IPlugin 接口。

  14. 实施接口成员。

    您的类现在应如下图所示。

任务 2:格式化电话号码

  1. 从服务提供商处获取执行上下文。 用下面的代码片段替换 Execute 方法中的异常。

     IPluginExecutionContext context =
     (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    
  2. 检查目标的输入参数。 将以下代码片段添加到 Execute 方法中。

     if (!context.InputParameters.ContainsKey("Target"))
    
     throw new InvalidPluginExecutionException("No target found");
    
  3. 将以下代码片段添加到 Execute 方法中。 该代码片段将从输入参数中获取目标实体,然后检查其属性是否包含 telephone1(联系人的商务电话、客户的电话)。

     var entity = context.InputParameters["Target"] as Entity;
    
     if (!entity.Attributes.Contains("telephone1"))
    
     return;
    
  4. 将以下代码片段添加到 Execute 函数中。 本代码片段将删除用户提供的电话号码中的所有非数字字符。

     string phoneNumber = (string)entity["telephone1"];
    
     var formattedNumber = Regex.Replace(phoneNumber, @"[^\d]", "");
    
  5. 将 telephone1 设置为格式化的电话号码。 将以下代码片段添加到 Execute 方法中。

     entity["telephone1"] = formattedNumber;
    

    Execute 方法现在应该类似于下图。

  6. 右键单击该项目并选择属性

  7. 选择签名选项卡,选中标记为为程序集签名 的框,然后选择新建密钥文件

  8. 密钥文件名字段中输入 contoso.snk,清除使用密码保护我的密钥文件复选框,然后选择确定

  9. 关闭属性选项卡。

  10. 构建项目,并确保构建成功。

任务 3:注册插件和步骤

注意

如果您没有 Dynamics 365 SDK 工具,请参阅从 NuGet 下载工具进行下载。

  1. 启动 Plug-in Registration Tool 应用程序。

  2. 选择创建新连接

  3. 选择 Office 365,选中显示高级复选框,提供您的凭据,然后选择登录

  4. 选择注册,然后选择注册新程序集

  5. 选择浏览

  6. 转到您创建的类库的 Bin > Debug 文件夹,选择 D365PackageProject.dll,然后选择打开

  7. 选择注册所选插件

  8. 选择确定

  9. 展开新注册的程序集。

  10. 右键单击插件,然后选择注册新步骤

  11. 消息选择创建,为主要实体选择联系人

  12. 执行的事件管道阶段选择 PreOperation,然后选择注册新步骤

  13. 选择关闭

  14. 右键单击插件,然后再次选择注册新步骤

  15. 消息选择更新,为主要实体选择联系人,然后选择属性查找。

  16. 清除全选复选框,选择商务电话复选框,然后选择确定

  17. 执行的事件管道阶段选择 PreOperation,然后选择注册新步骤

任务 4:测试插件

  1. 转到您的 Maker Portal 并确保选择正确的环境。

  2. 选择应用并启动筹款活动应用程序。

  3. 选择仪表板并打开其中一个联系人。

  4. 选择 + 新建

  5. 分别在名字姓氏商务电话中输入测试联系人(123)-555-0100,然后选择保存

    应该保存记录,并且商务电话应该只显示数字值。

  6. 商务电话更改为 001-123-555-0100 并等待几秒钟。

    记录应该更新,并且商务电话应该只显示数字值。

练习 2:创建/检索多个插件

在本练习中,您将创建一个插件,该插件将在检索时和检索多个时运行。 该插件将括号和破折号添加到电话号码。

每个练习都包括应用场景和学习目标。 应用场景描述了练习的目的,同时列出了目标并具有要点。

任务 1:创建插件

  1. 启动 Visual Studio。

  2. 打开您在练习 1 中创建的项目。

  3. 右键单击该项目并选择添加 > 类

  4. 名称字段中,为该类别输入 PostOperationFormatPhoneOnRetrieveMultiple,然后选择添加

  5. 将 using 语句添加到新类中,如下所示:

     using Microsoft.Xrm.Sdk;
    
  6. 将该类设为公共类,并实施 IPlugin 接口。

  7. 实施接口成员。 您的类现在应如下图所示。

任务 2:为检索设置电话号码格式

  1. 从服务提供商处获取执行上下文。 用下面的代码片段替换 Execute 方法中的异常。

     IPluginExecutionContext context =
     (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    
  2. 检查消息名称是 Retrieve 还是 RetrieveMultiple。 将以下代码片段添加到 Execute 方法中。

     if (context.MessageName.Equals("Retrieve"))	
     {
    
     }	
     else if(context.MessageName.Equals("RetrieveMultiple"))	
     {
    
     }
    
  3. 检查输出参数是否包含业务实体,以及它是否是一种实体。 将以下代码片段粘贴到 if retrieve 条件中。

     if (!context.OutputParameters.Contains("BusinessEntity") && context.OutputParameters["BusinessEntity"] is Entity)
     throw new InvalidPluginExecutionException("No business entity found");
    
  4. 获取实体并检查它是否包含电话 1 字段。 在 if retrieve 条件中添加以下代码片段。

     var entity = (Entity)context.OutputParameters["BusinessEntity"];
    
     if (!entity.Attributes.Contains("telephone1"))	
         return;
    
  5. 将以下代码片段添加到 if retrieve 条件中。 该代码片段尝试将 telephone1 解析为 long,如果解析不成功,将返回。

     if (!long.TryParse(entity["telephone1"].ToString(), out long phoneNumber))
    
     return;
    
  6. 通过添加括号和破折号来格式化电话号码。 在 if retrieve 条件中添加以下代码片段。

     var formattedNumber = String.Format("{0:(###) ###-####}", phoneNumber);
     entity["telephone1"] = formattedNumber;
    

Execute 方法的检索部分现在应该类似于下图。

任务 3:格式化电话号码以使用 retrieve multiple

  1. 将以下代码片段添加到 retrieve multiple 条件内部。 该代码片段将检查输出参数是否包含 BusinessEntityCollection,以及它是否属于 EntityCollection 类型。

     if(!context.OutputParameters.Contains("BusinessEntityCollection") && context.OutputParameters ["BusinessEntityCollection"] is EntityCollection)
         throw new InvalidPluginExecutionException("No business entity collection found");
    
  2. 从输出参数中获取实体集合。 在 retrieve multiple 条件中添加以下代码片段。

     var entityCollection = (EntityCollection)context.OutputParameters["BusinessEntityCollection"];
    
  3. 循环访问实体集合中的每个实体。

     foreach (var entity in entityCollection.Entities)	
     {
    
     }
    
  4. foreach 条件中添加以下代码片段。 该片段将执行与 retrieve 条件相同的操作。

     if (entity.Attributes.Contains("telephone1") && entity["telephone1"] != null)
     {
        if (long.TryParse(entity["telephone1"].ToString(), out long phoneNumber))
        {
            var formattedNumber = String.Format("{0:(###) ###-####}", phoneNumber);
            entity["telephone1"] = formattedNumber;
        }
     }
    

    Execute 方法的 retrieve multiple 部分现在应该类似于下图。

  5. 重新构建项目,并确保构建成功。

任务 4:更新插件程序集和注册步骤

  1. 启动 Plug-in Registration Tool 并选择创建新连接

  2. 选择 Office 365,选择显示高级,提供您的凭据,然后选择登录

  3. 选择您在练习 1 中注册的程序集,然后选择更新

  4. 选择浏览

  5. 转到项目的 debug 文件夹,选择 D365PackageProject.dll,然后选择打开

  6. 选择插件,然后选择更新所选插件

  7. 选择确定

  8. 右键单击新插件,然后选择注册新步骤

  9. 消息选择 Retrieve,为主要实体选择联系人,然后为执行的事件管道阶段选择 PostOperation。 确保您为执行模式选择了同步,然后选择注册新步骤

  10. 右键单击插件,然后再次选择注册新步骤

  11. 消息选择 RetrieveMultiple,为主要实体选择联系人,然后为执行的事件管道阶段选择 PostOperation。 确保您为执行模式选择了同步,然后选择注册新步骤

任务 5:测试插件

  1. 转到您的 Maker Portal 并确保您处于正确的环境中。

  2. 选择应用。 选择募款活动应用程序,然后选择编辑。 您将向应用程序中添加联系人表。

  3. 选择 + 新建页面。

  4. 选择 Dataverse 表,然后选择下一步

  5. 选择现有表。 然后选择联系人表,再选择添加

  6. 选择播放

  7. 选择保存并继续

  8. 再次选择播放

  9. 选择联系人

  10. 没有采用新格式保存的现有记录不会改变。 选择 + 新建

  11. 提供以下信息,然后选择保存。 记录应该被保存,插件应该应用新的格式。

  12. 再次选择联系人。 您创建的记录应该具有新的格式。

  13. 选择一个现有联系人将其打开。

  14. 编辑商务电话,如下所示:

  15. 选择保存。 新格式应该已应用。 再次选择联系人

编辑过的电话号码应具有新的格式。