Microsoft Dynamics CRM - ปลั๊กอิน

ปลั๊กอินคือตรรกะทางธุรกิจแบบกำหนดเองที่รวมเข้ากับ Microsoft Dynamics CRM เพื่อปรับเปลี่ยนหรือขยายลักษณะการทำงานมาตรฐานของแพลตฟอร์ม ปลั๊กอินทำหน้าที่เป็นตัวจัดการเหตุการณ์และได้รับการลงทะเบียนเพื่อดำเนินการกับเหตุการณ์เฉพาะใน CRM ปลั๊กอินเขียนด้วยภาษา C # หรือ VB และสามารถทำงานได้ทั้งในโหมดซิงโครนัสหรืออะซิงโครนัส

บางสถานการณ์ที่คุณจะเขียนปลั๊กอินคือ -

  • คุณต้องการดำเนินการตามตรรกะทางธุรกิจบางอย่างเช่นการอัปเดตฟิลด์บางฟิลด์ของเรกคอร์ดหรืออัปเดตเรกคอร์ดที่เกี่ยวข้อง ฯลฯ เมื่อคุณสร้างหรืออัปเดตเรกคอร์ด CRM

  • คุณต้องการเรียกใช้บริการเว็บภายนอกเกี่ยวกับเหตุการณ์บางอย่างเช่นการบันทึกหรืออัปเดตเรกคอร์ด

  • คุณต้องการคำนวณค่าฟิลด์แบบไดนามิกเมื่อเปิดบันทึกใด ๆ

  • คุณต้องการทำให้กระบวนการอัตโนมัติเช่นการส่งอีเมลไปยังลูกค้าของคุณเกี่ยวกับเหตุการณ์บางอย่างใน CRM

กรอบเหตุการณ์

Event Processing Framework ใน CRM ประมวลผลคำร้องขอปลั๊กอินซิงโครนัสและอะซิงโครนัสโดยส่งไปยังไปป์ไลน์การดำเนินการเหตุการณ์ เมื่อใดก็ตามที่เหตุการณ์ทริกเกอร์ตรรกะของปลั๊กอินข้อความจะถูกส่งไปยัง CRM Organization Web Service ซึ่งสามารถอ่านหรือแก้ไขโดยปลั๊กอินอื่น ๆ หรือการทำงานหลักของแพลตฟอร์ม

ขั้นตอนไปป์ไลน์ของปลั๊กอิน

ไปป์ไลน์ปลั๊กอินทั้งหมดแบ่งออกเป็นหลายขั้นตอนซึ่งคุณสามารถลงทะเบียนตรรกะทางธุรกิจที่กำหนดเองได้ ขั้นตอนไปป์ไลน์ที่ระบุระบุว่าในขั้นตอนใดของรอบการเรียกใช้ปลั๊กอินโค้ดปลั๊กอินของคุณจะทำงาน จากขั้นตอนไปป์ไลน์ที่ระบุทั้งหมดในตารางต่อไปนี้คุณสามารถลงทะเบียนปลั๊กอินที่กำหนดเองได้เฉพาะในช่วงก่อนและหลังเหตุการณ์ คุณไม่สามารถลงทะเบียนปลั๊กอินบน Platform Core Main Operations ได้

เหตุการณ์ ชื่อเวที คำอธิบาย
ก่อนเหตุการณ์ การตรวจสอบล่วงหน้า สเตจในไปป์ไลน์สำหรับปลั๊กอินที่จะดำเนินการก่อนการทำงานของระบบหลัก ปลั๊กอินที่ลงทะเบียนในขั้นตอนนี้อาจดำเนินการภายนอกธุรกรรมฐานข้อมูล
ก่อนเหตุการณ์ ก่อนการดำเนินการ สเตจในไปป์ไลน์สำหรับปลั๊กอินที่จะดำเนินการก่อนการทำงานของระบบหลัก ปลั๊กอินที่ลงทะเบียนในขั้นตอนนี้จะดำเนินการภายในธุรกรรมฐานข้อมูล
การทำงานหลักของแพลตฟอร์ม หลัก Intransaction การทำงานหลักของระบบเช่นสร้างอัปเดตลบและอื่น ๆ ไม่สามารถลงทะเบียนปลั๊กอินที่กำหนดเองได้ในขั้นตอนนี้ สำหรับใช้ภายในเท่านั้น.
หลังเหตุการณ์ หลังการผ่าตัด สเตจในไปป์ไลน์สำหรับปลั๊กอินซึ่งจะดำเนินการหลังจากการดำเนินการหลัก ปลั๊กอินที่ลงทะเบียนในขั้นตอนนี้จะดำเนินการภายในธุรกรรมฐานข้อมูล

เมื่อใดก็ตามที่แอปพลิเคชัน CRM เรียกใช้เหตุการณ์ (เช่นการบันทึกหรืออัปเดตเรกคอร์ด) ลำดับการดำเนินการต่อไปนี้จะเกิดขึ้น -

  • เหตุการณ์จะทริกเกอร์การเรียกใช้บริการเว็บและการดำเนินการจะถูกส่งผ่านขั้นตอนไปป์ไลน์เหตุการณ์ (ก่อนเหตุการณ์, การดำเนินการหลักของแพลตฟอร์ม, หลังเหตุการณ์)

  • ข้อมูลจะถูกบรรจุภายในเป็นข้อความ OrganizationRequest และส่งไปยังวิธีการบริการเว็บ CRM ภายในและการดำเนินการหลักของแพลตฟอร์มในที่สุด

  • ข้อความ OrganizationRequest จะได้รับก่อนโดยปลั๊กอินก่อนเหตุการณ์ซึ่งสามารถแก้ไขข้อมูลก่อนที่จะส่งต่อไปยังการดำเนินการหลักของแพลตฟอร์ม หลังจากการดำเนินการหลักของแพลตฟอร์มข้อความจะถูกบรรจุเป็น OrganizationResponse และส่งต่อไปยังปลั๊กอินหลังการดำเนินการ ปลั๊กอิน postoperations สามารถเลือกแก้ไขข้อมูลนี้ได้ก่อนที่จะส่งต่อไปยังปลั๊กอิน async

  • ปลั๊กอินรับข้อมูลนี้ในรูปแบบของวัตถุบริบทที่ส่งผ่านไปยังเมธอด Execute หลังจากนั้นการประมวลผลต่อไปจะเกิดขึ้น

  • หลังจากการประมวลผลปลั๊กอินทั้งหมดเสร็จสิ้นการดำเนินการจะถูกส่งกลับไปยังแอปพลิเคชันที่เรียกใช้เหตุการณ์

ข้อความปลั๊กอิน

ข้อความคือเหตุการณ์ที่ลงทะเบียนปลั๊กอิน (หรือตรรกะทางธุรกิจ) ตัวอย่างเช่นคุณสามารถลงทะเบียนปลั๊กอินบนเอนทิตีสร้างข้อความของผู้ติดต่อ สิ่งนี้จะทำให้ตรรกะทางธุรกิจเริ่มทำงานเมื่อใดก็ตามที่มีการสร้างเรกคอร์ดผู้ติดต่อใหม่

สำหรับเอนทิตีแบบกำหนดเองต่อไปนี้เป็นข้อความที่สนับสนุนโดยขึ้นอยู่กับว่าเอนทิตีเป็นของผู้ใช้หรือองค์กรที่เป็นเจ้าของ

ชื่อข้อความ ประเภทการเป็นเจ้าของ
กำหนด เอนทิตีที่ผู้ใช้เป็นเจ้าของเท่านั้น
สร้าง เอนทิตีที่ผู้ใช้เป็นเจ้าของและองค์กรที่เป็นเจ้าของ
ลบ เอนทิตีที่ผู้ใช้เป็นเจ้าของและองค์กรที่เป็นเจ้าของ
GrantAccess เอนทิตีที่ผู้ใช้เป็นเจ้าของเท่านั้น
ModifyAccess เอนทิตีที่ผู้ใช้เป็นเจ้าของเท่านั้น
ดึงข้อมูล เอนทิตีที่ผู้ใช้เป็นเจ้าของและองค์กรที่เป็นเจ้าของ
RetrieveMultiple เอนทิตีที่ผู้ใช้เป็นเจ้าของและองค์กรที่เป็นเจ้าของ
RetrievePrincipalAccess เอนทิตีที่ผู้ใช้เป็นเจ้าของเท่านั้น
RetrieveSharedPrincipalsAndAccess เอนทิตีที่ผู้ใช้เป็นเจ้าของเท่านั้น
RevokeAccess เอนทิตีที่ผู้ใช้เป็นเจ้าของเท่านั้น
SetState เอนทิตีที่ผู้ใช้เป็นเจ้าของและองค์กรที่เป็นเจ้าของ
SetStateDynamicEntity เอนทิตีที่ผู้ใช้เป็นเจ้าของและองค์กรที่เป็นเจ้าของ
อัปเดต เอนทิตีที่ผู้ใช้เป็นเจ้าของและองค์กรที่เป็นเจ้าของ

สำหรับเอนทิตีที่ไม่อยู่ในกรอบเริ่มต้นมีข้อความที่รองรับมากกว่า 100 ข้อความ ข้อความเหล่านี้บางส่วนสามารถใช้ได้กับเอนทิตีทั้งหมดในขณะที่บางข้อความเป็นข้อความเฉพาะสำหรับบางเอนทิตี คุณสามารถค้นหารายการข้อความที่รองรับทั้งหมดในไฟล์ excel ภายใน SDK:SDK\Message-entity support for plug-ins.xlsx

การเขียนปลั๊กอิน

ในส่วนนี้เราจะเรียนรู้พื้นฐานการเขียนปลั๊กอิน เราจะสร้างปลั๊กอินตัวอย่างที่สร้างกิจกรรมงานเพื่อติดตามผลกับลูกค้าเมื่อใดก็ตามที่มีการเพิ่มลูกค้าใหม่ในระบบกล่าวคือเมื่อใดก็ตามที่มีการสร้าง Contactrecord ใหม่ใน CRM

ก่อนอื่นคุณจะต้องรวมการอ้างอิงถึง Microsoft.Xrm.Sdkเนมสเปซ CRM SDK ประกอบด้วยชุดประกอบ SDK ที่จำเป็นทั้งหมด สมมติว่าคุณได้ดาวน์โหลดและติดตั้ง SDK ในบทที่ 2 แล้วให้เปิด Visual Studio สร้างโครงการใหม่ประเภท Class Library คุณสามารถตั้งชื่อโครงการเป็น SamplePlugins และคลิกตกลง

เพิ่มการอ้างอิงของ Microsoft.Xrm.Sdkประกอบกับโครงการของคุณ มีการประกอบอยู่ในSDK/Bin.

ตอนนี้สร้างคลาสชื่อ PostCreateContact.cs และขยายชั้นเรียนจาก IPlugin. ถึงตอนนี้รหัสของคุณจะมีลักษณะดังต่อไปนี้

คุณจะต้องเพิ่มการอ้างอิงถึง System.Runtime.Serialization เมื่อคุณเพิ่มข้อมูลอ้างอิงที่จำเป็นแล้วให้คัดลอกรหัสต่อไปนี้ภายในไฟล์PostCreateContact ชั้นเรียน

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xrm.Sdk;

namespace SamplePlugins {
   public class PostCreateContact:IPlugin {
      /// A plug-in that creates a follow-up task activity when a new account is created.
      /// Register this plug-in on the Create message, account entity,
      /// and asynchronous mode.

      public void Execute(IServiceProviderserviceProvider) {
         // Obtain the execution context from the service provider.
         IPluginExecutionContext context =(IPluginExecutionContext)
            serviceProvider.GetService(typeof(IPluginExecutionContext));

         // The InputParameters collection contains all the data
            passed in the message request.

         if(context.InputParameters.Contains("Target")&&
            context.InputParameters["Target"]isEntity) {
            
            // Obtain the target entity from the input parameters.
            Entity entity = (Entity)context.InputParameters["Target"];
            try {
               
               // Create a task activity to follow up with the account customer in 7 days
               Entity followup = new Entity("task");
               followup["subject"] = "Send e-mail to the new customer.";
               followup["description"] =
                  "Follow up with the customer. Check if there are any new issues
                  that need resolution.";
               
               followup["scheduledstart"] = DateTime.Now;
               followup["scheduledend"] = DateTime.Now.AddDays(2);
               followup["category"] = context.PrimaryEntityName;

               // Refer to the contact in the task activity.
               if(context.OutputParameters.Contains("id")) {
                  Guid regardingobjectid = new Guid(context.OutputParameter
                     s["id"].ToString());
                  string regardingobjectidType = "contact";
                  followup["regardingobjectid"] = 
                     new EntityReference(rega rdingobjectidType,regardingobjectid);
               }
               
               // Obtain the organization service reference.
               IOrganizationServiceFactory serviceFactory =
                  (IOrganizationSer viceFactory)serviceProvider.GetService
                  (typeof(IOrganizationServiceFactory));
               IOrganizationService service = 
                  serviceFactory.CreateOrganizationService(context.UserId);

               // Create the followup activity
               service.Create(followup);
            } catch(Exception ex) {
               throw new InvalidPluginExecutionException(ex.Message);
            }
         }
      }
   }
}

ต่อไปนี้เป็นคำอธิบายทีละขั้นตอนว่ารหัสนี้ทำอะไร -

Step 1- ใช้เมธอด Execute โดยใช้วัตถุ IServiceProvider เป็นพารามิเตอร์ ผู้ให้บริการมีการอ้างอิงถึงวัตถุที่มีประโยชน์มากมายที่คุณกำลังจะใช้ภายในปลั๊กอิน

Step 2 - รับวัตถุ IPluginExecutionContext โดยใช้เมธอด GetService ของ IServiceProvider

Step 3- รับวัตถุของเอนทิตีเป้าหมายจากคอลเล็กชัน InputParameters ของวัตถุบริบท อ็อบเจ็กต์คลาสเอนทิตีนี้อ้างถึงเรกคอร์ดเอนทิตีผู้ติดต่อที่จะลงทะเบียนปลั๊กอินของเรา

Step 4- จากนั้นจะสร้างออบเจ็กต์ของเอนทิตีงานและตั้งค่าหัวเรื่องคำอธิบายวันที่หมวดหมู่และวัตถุประสงค์ที่เหมาะสม Releobjectid ระบุว่าผู้ติดต่อใดกำลังสร้างเรกคอร์ดกิจกรรมนี้ คุณจะเห็นได้ว่ารหัสได้รับ id ของเรกคอร์ดผู้ติดต่อหลักโดยใช้บริบทเอาท์พุทพารามิเตอร์และเชื่อมโยงกับเรกคอร์ดเอนทิตีงานที่คุณสร้างขึ้น

Step 5 - สร้างวัตถุของ IOrganizationServiceFactory โดยใช้วัตถุ IServiceProvider

Step 6 - สร้างออบเจ็กต์ของ IOrganizationService โดยใช้อ็อบเจ็กต์ IOrganizationServiceFactory

Step 7- สุดท้ายใช้เมธอด Create ของเซอร์วิสออบเจ็กต์นี้ สร้างกิจกรรมติดตามผลซึ่งได้รับการบันทึกไว้ใน CRM

การลงนามใน Plugin Assembly

ส่วนนี้ใช้ได้เฉพาะในกรณีที่คุณลงทะเบียนแอสเซมบลีปลั๊กอินเป็นครั้งแรก คุณต้องลงชื่อเข้าใช้แอสเซมบลีด้วยคีย์เพื่อให้สามารถใช้งานปลั๊กอินได้ คลิกขวาที่โซลูชันแล้วคลิกคุณสมบัติ

เลือกแท็บการลงนามจากตัวเลือกด้านซ้ายและเลือกตัวเลือก "ลงชื่อเข้าใช้แอสเซมบลี" จากนั้นเลือกสร้างจากตัวเลือกเลือกไฟล์คีย์ชื่อที่คาดเดายาก

ป้อนชื่อไฟล์คีย์เป็น sampleplugins (อาจเป็นชื่ออื่นก็ได้ที่คุณต้องการ) ยกเลิกการเลือกตัวเลือกป้องกันไฟล์คีย์ของฉันด้วยรหัสผ่านแล้วคลิกตกลง คลิกบันทึก

สุดท้ายสร้างโซลูชัน คลิกขวา→สร้าง การสร้างโซลูชันจะสร้างแอสเซมบลี DLL ซึ่งเราจะใช้ในบทถัดไปเพื่อลงทะเบียนปลั๊กอินนี้

การจัดการข้อยกเว้นในปลั๊กอิน

บ่อยกว่านั้นตรรกะปลั๊กอินของคุณจะต้องจัดการกับข้อยกเว้นรันไทม์ สำหรับปลั๊กอินซิงโครนัสคุณสามารถส่งคืนไฟล์InvalidPluginExecutionExceptionข้อยกเว้นซึ่งจะแสดงกล่องโต้ตอบข้อผิดพลาดให้กับผู้ใช้ กล่องโต้ตอบข้อผิดพลาดจะมีข้อความแสดงข้อผิดพลาดแบบกำหนดเองที่คุณส่งผ่านไปยังวัตถุข้อความของวัตถุข้อยกเว้น

หากคุณดูรหัสของเราเรากำลังทิ้งข้อยกเว้น InvalidPluginExecutionException ในบล็อก catch ของเรา

throw new InvalidPluginExecutionException(ex.Message);

สรุป

ปลั๊กอินมีความสำคัญอย่างยิ่งต่อการใช้งาน CRM แบบกำหนดเอง ในบทนี้เรามุ่งเน้นไปที่การทำความเข้าใจกับรูปแบบกรอบเหตุการณ์ขั้นตอนไปป์ไลน์ข้อความและการเขียนปลั๊กอินตัวอย่าง ในบทถัดไปเราจะลงทะเบียนปลั๊กอินนี้ใน CRM และดูว่ามันทำงานได้ตั้งแต่ end-to-end