How to Write and Understand a Dynamics CRM Plugin
Here’s a sample plugin code in Dynamics CRM written in C#, along with a detailed explanation of each line. This plugin will update the "Description" field of an entity whenever a record is created.
Sample Plugin Code
using System; // For basic .NET types
using Microsoft.Xrm.Sdk; // Provides key interfaces for CRM plugin development
using Microsoft.Xrm.Sdk.Query; // For performing queries against CRM data
namespace SamplePluginNamespace // Custom namespace for the plugin
{
public class SamplePlugin : IPlugin // Plugin class implementing the IPlugin interface
{
public void Execute(IServiceProvider serviceProvider)
{
// STEP 1: Retrieve the context of the plugin
IPluginExecutionContext context =
(IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.MessageName != "Create" || context.Stage != 40)
return; // Exit if the message is not 'Create' or it is not in the 'PostOperation' stage
// STEP 2: Obtain the organization service
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
// STEP 3: Retrieve the target entity from the input parameters
Entity targetEntity = (Entity)context.InputParameters["Target"];
try
{
// STEP 4: Update the 'Description' field with a custom message
targetEntity["description"] = $"Record created on {DateTime.Now}";
// STEP 5: Persist changes back to the database
service.Update(targetEntity);
}
catch (Exception ex)
{
// STEP 6: Handle errors and rethrow as an InvalidPluginExecutionException
throw new InvalidPluginExecutionException($"An error occurred in the SamplePlugin: {ex.Message}", ex);
}
}
}
}
Line-by-Line Explanation
-
using System;
- Imports basic .NET library types such as
DateTime
and exceptions.
- Imports basic .NET library types such as
-
using Microsoft.Xrm.Sdk;
- Imports CRM SDK interfaces for plugins such as
IPlugin
,IPluginExecutionContext
, andIOrganizationService
.
- Imports CRM SDK interfaces for plugins such as
-
using Microsoft.Xrm.Sdk.Query;
- Enables querying CRM entities when interacting with data.
-
namespace SamplePluginNamespace
- Defines a custom namespace to organize the code logically and avoid naming conflicts.
-
public class SamplePlugin : IPlugin
- Implements the
IPlugin
interface, making this class recognized by Dynamics CRM as a plugin.
- Implements the
-
public void Execute(IServiceProvider serviceProvider)
- The main method executed when the plugin is triggered, as required by the
IPlugin
interface.
- The main method executed when the plugin is triggered, as required by the
-
Retrieve plugin execution context:
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
- Retrieves the execution context, which contains all information about the triggered event.
-
Validate event type and stage:
if (context.MessageName != "Create" || context.Stage != 40) return;
- Ensures the plugin executes only for the
Create
message in thePostOperation
stage.
- Ensures the plugin executes only for the
-
Create organization service:
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
- Creates an organization service instance for interacting with CRM data.
-
Retrieve the target entity:
Entity targetEntity = (Entity)context.InputParameters["Target"];
- Extracts the target record being created.
-
Update the
Description
field:targetEntity["description"] = $"Record created on {DateTime.Now}";
- Sets the
Description
field value dynamically based on the current date and time.
- Sets the
-
Persist changes to CRM:
service.Update(targetEntity);
- Updates the record in the database with the new value in the
Description
field.
- Updates the record in the database with the new value in the
-
Handle exceptions:
catch (Exception ex) { throw new InvalidPluginExecutionException($"An error occurred in the SamplePlugin: {ex.Message}", ex); }
- Catches runtime exceptions and throws them as
InvalidPluginExecutionException
for debugging or logging purposes.
- Catches runtime exceptions and throws them as
Usage Details
- Registration: Use the Plugin Registration Tool to register this plugin in CRM for the
Create
message. - Target Entity: Ensure the target entity has a field named
description
. Adjust the field name accordingly if different.
This plugin demonstrates essential patterns like validation, service access, and error handling, ensuring robust development in Dynamics CRM.
Comments
Post a Comment