Home

Desarrollo de plugins en Microsoft Dynamics CRM 2011. Introducción

webmaster's picture
Un plugin es la lógica de negocio a medida que se puede integrar en con Microsoft Dynamics CRM 2011 como dll para modificar o aumentar o personalizar el comportamiento estándar de la plataforma. Los Plug-ins son controladores de eventos, y son necesarios firmarlos y registrarlos para que puedan ejecutar una respuesta a un evento en particular en la plataforma. 
A continuación describimos los aspectos a tener en cuenta para agregar lógica de negocios personalizada para en nuestro Microsoft Dynamics CRM a través del desarrollo y registro de plug-ins realizando un ejemplo sencillo que incluye todo el proceso.

Primeramente tenemos en cuenta la arquitectura y elementos que intervienen en el desarrollo y despliegue de un plugin. El subsistema de procesamiento de eventos de Microsoft Dynamics CRM ejecuta plug-ins basados ​​en un modelo de ejecución de la canalización (pipeline) de mensajes. Una acción del usuario en la aplicación web de Microsoft Dynamics CRM o un método del SDK llamado por un plug-in o de otro tipo de aplicaciones devuelve un mensaje que se envía al servicio web de la organización. El mensaje contiene información de la entidad empresarial y de funcionamiento básicoque se transmite a través de la canalización de ejecución de evento en el que se puede leer o modificar el funcionamiento básico de la plataforma de forma sincrona o asincroona.

Desarrollando el plugin en Micosoft Visual Studio 2010

Cuando creamos una solucion de tipo CRM en Micosoft Visual Studio 2010 por defecto nos inserta un proyecto Plugin y otro WorkFlow. Estos proyecto ya contiene una estructur básica de metodos para implementar cualquier fucionalidad, pero son un poco extensos si se trata de hacer algo sencillo.

Nosotros preferimos empezar desde un proyecto nuevo de tipo Class Library (Biblioteca de clases) y añadir las referencias necesarias para la codificación del mismo que son:

Las referencias que aparecen marcadas en azul provienen desde el SDL de Microsoft Dynamics CRM 2011 y las que aparecn en rojo pertenecen a las librerias de .NET 4.0. El fichero plugincrm.snk es la firma que acompañará a nuestro plugin en la compilación necesaria para ser distribuido. léa mas adelante "Firmando el plugin"

A continuación introducimos el código del método principal del plugin Execute en donde se va a desarrollar toda la lógica del mismo y que contiene un esquema principal de ejecución que se inserta al inicio.

 #region Execute // Metodo inicial obligatorio para las ejecuciones del plugin
 
        public void Execute(IServiceProvider serviceProvider)  // Cuando se realice la ejecución CRM nos devuelve un IServiceProvider
        {
            // Dentro del recogemos un objeto que es el de tipo IPluginExecutionContext
            IPluginExecutionContext context =
                (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
 
            // El factory sirve para recoger elservicio de CRM y poder realizar las operaiones de mantenimiento 
            IOrganizationServiceFactory factory =
                (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(context.UserId); // Muy iimportante que se ejecute con el usuario que está autenticado
 
            // El ITracingService nos sirve para añadir trazas al pluing para depurar los errores.
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
 
            try
            {
                // Plug-in Logica de negocio a partir de esta linea
                // Invocamos la organization service methods.
            }
            catch (FaultException<OrganizationServiceFault> ex)
            {
                // Handle the exception.
 
            }
 
        }
 #endregion Execute

Después de insertar el código base, implementamos una función que verifica que la entidad new_gastos de nuestro CRM cuando se introduzca un concepto de gasto que tenga un tamaño menor de 3 caracteres.

try
            {
                // Plug-in Logica de negocio a partir de esta linea
                // Invocamos la organization service methods.
                // The InputParameters collection contains all the data passed in the message request.
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    tracingService.Trace("Paso1");
                    // Obtain the target entity from the input parameters.
                    Entity entity = (Entity)context.InputParameters["Target"];
 
                    if (entity.LogicalName == "new_gastos")
                    {
                        if (entity.Attributes.Contains("new_concepto") && entity.Attributes["new_concepto"].ToString().Length <= 3)
                        {
                            tracingService.Trace("Gasto no Aceptado");
                            throw new InvalidPluginExecutionException("Verifique el Concepto del gasto de mas de 3 caracteres");
                        }
                    }
 
                }
            }
            catch (Exception ex)
            {
                // Handle the exception.
                tracingService.Trace("Error de ejecucion");
                tracingService.Trace("FollowupPlugin: {0}", ex.ToString());
                throw;
            }

Firmando el plugin

Una vez compilado nuestro código antes de dsitribuirlo necesitamos incorporarle una firma que permitirá que nuestro plugin sea publicado en el CRM. 

1. En las propiedades del proyecto vamos a la parte Firmas.

2. Pulsamos nueva firma

3. Escribimos el nombre de la clave. Podemos también proteger con contraseña la firma para que no sea abierta por otro proyecto sin la verificación de la contraseña. Esto generará dentro proyecto un archivo con extensión .snk que irá embebido en la dll compilada. Guardamos los cambios del proyecto. 

Registrando el plugin en el CRM

Dentro de las herramientas que facilita el SDK se encuentra en la carpeta ..\SDK\Bin el PluginRegistration.exe que se utiliza para realizar todo el proceso de publicación y registro de nuestro plugin en el CRM. La ejecutamos

En caso de que el SDK se encuentre en una carpeta del sistema, como \Archivos de programa\... debe ejecutarse esta herramienta don privilegios de Administrador.

 

En la apertura del programa por primera vez tenemos que generar una nueva conección e introducir los datos del servidor, y del usuario y conectar con el CRM. Saldrá una ventana emergente para validar la contraseña del usuario.

Una vez conectado desplegamos los Asemblies de la Organizacion y pulsamos en Register New Assembly

Ya con la dll incorporada elejimos donde queremos que se ejecute el plugin:

1. Sandbox: Valdrá también para el CRM On-line. Si es fuera del Sandbox (opción no) nos permitiría un acceos los recursos de forma mas extendida; pero no funcionaría en el on-line
2. Podemos registrar en Database de SQL Server, en Disk (disco) o en el GAC (GLobal Assembly Cache). 

En caso de elejir registrar en Disk, la dll se debería alojar en la carpeta de instalación \Server\bin de cada servidor. Si queremos hacer depuraciones se tendria que acompañar del .PDB file en la misma carpeta, vea "Depurando el plugin más adelante". En Database valdría también para el CRM-OnLINE en caso de exportar el plugin.

Una vez que el plugin está registrado hay que indicarle en que pasos y bajo que condiciones queremos que se dispare el plugin dentro de la aplicación. Para esto tenemos que tener muy clara el esque de la arquitectura y elementos que contiene el proceso de ejecución del plugin para delimitar muy bien las funcionalidaades del mismo.

En nuestro caso:

1. Que se ejecute en el Update (Segun los metodos del componente service).
2. Que la Entity sea new_gastos.
3. El Attributo es el new_importe.
4. El contexto del usuario es el Calling; osea en que está conectado.
5. El orden de ejecución sea el primero (ponemos el número 1). Si tuviésemmos varios plugins tendriamos que especificar el orden de los mismos.
Importante : En el Pipeline Stage of Execution tendremos en cuenta segun el diagrama en que parte del proceso se va a disparar nuestro plugin. En este caso es Pre-validation. La ejecución va a ser sincrona, osea en conexion con el server.

Ya estaríamos en condiciones de probar nuestro plugin en el CRM y observar como nos muestra el mensaje de error en el momento de grabar un nuevo gasto.

Fuente: 

Centro Práctico de LEMURSOLUTION & Knowledge Base de Microsoft Dynamics

Contacto: 
webmaster