CRM 2011 Plugin Template
Here is the template to get you started on plugin development in CRM 2011:
To get the service context of your organisation :
Important Notes:
PRE PLUGINS
POST PLUGINS
OTHERS
Hope this helps,
Andreas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using System.ServiceModel; using Org.Entities.Crm; //this is the generated entities.cs for early bound namespace My.Plugins { //insert plugin comment public class AccountPlugin: IPlugin { ITracingService tracingService = null ; public void Execute(IServiceProvider serviceProvider) { // Extract the tracing service. tracingService = (ITracingService)serviceProvider.GetService( typeof (ITracingService)); if (tracingService == null ) throw new InvalidPluginExecutionException( "Failed to retrieve the tracing service." ); // 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" ] is Entity) { // Obtain the target entity from the input parameters. Entity entity = (Entity)context.InputParameters[ "Target" ]; // Get a reference to the Organization service. IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService( typeof (IOrganizationServiceFactory)); IOrganizationService service = factory.CreateOrganizationService(context.UserId); try { // Plug-in business logic goes below this line. // Invoke organization service methods.. // do whatever you have to do.. } catch (InvalidPluginExecutionException iex) { tracingService.Trace(iex.Message); tracingService.Trace(iex.StackTrace); throw iex; } catch (FaultException<organizationservicefault> ex) { tracingService.Trace(ex.Message); tracingService.Trace(ex.StackTrace); throw new InvalidPluginExecutionException( string .Format( "An error occurred in the {0} plug-in." , this .GetType().Name), ex); } catch (Exception e) { tracingService.Trace(e.Message); tracingService.Trace(e.StackTrace); throw new InvalidPluginExecutionException( string .Format( "An error occurred in the {0} plug-in." , this .GetType().Name), e); } } } } } |
To get the service context of your organisation :
1 | OrgServiceContext serviceContext = new OrgServiceContext(service); |
Important Notes:
PRE PLUGINS
- You don't need to call SaveChanges because the entity can be updated before it is saved into database.
- For pre-update, entity will only have attributes that are changed. To get the other attributes that don't change, you can query those attributes using the service context.
POST PLUGINS
- You need to call SaveChanges because the entity has been saved into database.
- Entity will have all updated attributes when retrieved using service context.
- When doing the post update of an entity that update the same entity attributes, loop will occur. To avoid this you can use context.Depth to check the loop count.
OTHERS
- For delete message, the context.InputParameters["Target"] is an EntityReference instead of Entity.
- You can check the context message using context.MessageName
Hope this helps,
Andreas
Comments
Post a Comment