FrameworkTemplate/Common/Plugins/BasePlugin.cs

using System;
using Microsoft.Xrm.Sdk;

namespace Common
{
    public abstract class BasePlugin : IPlugin
    {
        protected class LocalPluginContext
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "LocalPluginContext")]
            internal IServiceProvider ServiceProvider { get; private set; }

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "LocalPluginContext")]
            internal IOrganizationService OrganizationService { get; private set; }

            internal IOrganizationService ElevatedService { get; private set; }

            internal IPluginExecutionContext PluginExecutionContext { get; private set; }

            internal IServiceEndpointNotificationService NotificationService { get; private set; }

            internal ITracingService TracingService { get; private set; }

            private LocalPluginContext() { }

            /// <summary>
            /// Helper object that stores the services available in this plug-in.
            /// </summary>
            /// <param name="serviceProvider"></param>
            internal LocalPluginContext(IServiceProvider serviceProvider)
            {
                if (serviceProvider == null)
                {
                    throw new InvalidPluginExecutionException("serviceProvider");
                }

                PluginExecutionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                TracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                NotificationService = (IServiceEndpointNotificationService)serviceProvider.GetService(typeof(IServiceEndpointNotificationService));
                IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                OrganizationService = factory.CreateOrganizationService(PluginExecutionContext.UserId);
                ElevatedService = factory.CreateOrganizationService(null);
            }

            internal void Trace(string message)
            {
                if (string.IsNullOrWhiteSpace(message) || TracingService == null)
                {
                    return;
                }

                if (PluginExecutionContext == null)
                {
                    TracingService.Trace(message, null);
                }
                else
                {
                    TracingService.Trace(message);

                    //TracingService.Trace(
                    // "{0}, Correlation Id: {1}, Initiating User: {2}",
                    // message,
                    // PluginExecutionContext.CorrelationId,
                    // PluginExecutionContext.InitiatingUserId);
                }
            }
        }
        protected abstract void Execute(LocalPluginContext localcontext);

        public void Execute(IServiceProvider serviceProvider)
        {
            try
            {
                LocalPluginContext localcontext = new LocalPluginContext(serviceProvider);
                Execute(localcontext);
            }
            catch (Exception e)
            {
                if (e is InvalidPluginExecutionException)
                {
                    // Let InvalidPluginExecutionExceptions flow without wrapping them
                    throw;
                }
                var ex = new InvalidPluginExecutionException($"An error has occurred in CRM plugin '{GetType().Name}': {e.Message}", e);
                throw ex;
            }
        }
    }
}