20 octubre 2012

Filtrando la generación de Clases Early con crmsvcutil

- La herramienta incluida en el SDK crmsvcutil.exe es utilizada para generar las clases tipadas de early bound con todos los atributos (de sistema y custom) de nuestra organización CRM

- El enfoque early mejora notablemente el acceso mediante programación

- El fichero generado por la herramienta crmsvcutil contiene todas las entidades de nuestra organización, resultando un fichero de aproximadamente 5MB, por lo que es conveniente analizar qué entidades son realmente necesarias para el acceso desde diferentes puntos, por ejemplo plugins, aspx custom, desarrollos a medida etc.

- En este ejemplo vamos a crear una extensión para la herramienta crmsvcutil que filtre la generación de clases early de nuestra organización CRM, para incluir en el fichero sólo las entidades Cuenta, Contacto, Referencia, y Oportunidad

El proceso es el siguiente:

- Cree un nuevo proyecto Class Library desde Visual Studio, llamado SvcUtilFilter

- Incluya en el proyecto las siguientes referencias:

>> crmsvcutil.exe
>> Microsoft.Xrm.Sdk.dll
>> System.Runtime.Serialization

- El código de la librería es el siguiente

namespace SvcUtilFilter
{
    /// <summary>
    /// CodeWriterFilter for CrmSvcUtil that reads list of entities from an xml file to
    /// determine whether or not the entity class should be generated.
    /// </summary>
    public class CodeWriterFilter : ICodeWriterFilterService
    {
        //list of entity names to generate classes for.
        private HashSet<string> _validEntities = new HashSet<string>();

        //reference to the default service.
        private ICodeWriterFilterService _defaultService = null;

        /// <summary>
        /// constructor
        /// </summary>
        /// <param name="defaultService">default implementation</param>
        public CodeWriterFilter(ICodeWriterFilterService defaultService)
        {
            this._defaultService = defaultService;
            LoadFilterData();
        }

        /// <summary>
        /// loads the entity filter data from the filter.xml file
        /// </summary>
        private void LoadFilterData()
        {
            XElement xml = XElement.Load("filter.xml");
            XElement entitiesElement = xml.Element("entities");
            foreach (XElement entityElement in entitiesElement.Elements("entity"))
            {
                _validEntities.Add(entityElement.Value.ToLowerInvariant());
            }
        }

        /// <summary>
        /// /Use filter entity list to determine if the entity class 
        /// /should be generated.
        /// </summary>
        public bool GenerateEntity(EntityMetadata entityMetadata, 
            IServiceProvider services)
        {
           return
           (_validEntities.Contains(entityMetadata.LogicalName.ToLowerInvariant()));
        }

        //All other methods just use default implementation:

        public bool GenerateAttribute(AttributeMetadata attributeMetadata,
            IServiceProvider services)
        {
            return _defaultService.GenerateAttribute(attributeMetadata, services);
        }

        public bool GenerateOption(OptionMetadata optionMetadata, 
            IServiceProvider services)
        {
            return _defaultService.GenerateOption(optionMetadata, services);
        }

        public bool GenerateOptionSet(OptionSetMetadataBase optionSetMetadata, 
            IServiceProvider services)
        {
            return _defaultService.GenerateOptionSet(optionSetMetadata, services);
        }

        public bool GenerateRelationship(RelationshipMetadataBase 
            relationshipMetadata, EntityMetadata otherEntityMetadata, 
            IServiceProvider services)
        {
            return _defaultService.GenerateRelationship(relationshipMetadata, 
               otherEntityMetadata, services);
        }

        public bool GenerateServiceContext(IServiceProvider services)
        {
            return _defaultService.GenerateServiceContext(services);
        }
    }
}


- Incluya un nuevo fichero xml, llamado filter.xml, con la siguiente estructura

<?xml version="1.0" encoding="utf-8" ?>
<filter>
  <entities>
    <entity>account</entity>
    <entity>contact</entity>
    <entity>lead</entity>
    <entity>opportunity</entity>
  </entities>
</filter>


- Compile el proyecto, y asegúrese de copiar la dll y el fichero xml en la misma carpeta que la aplicación crmsvcutil.exe

- Ahora lance la aplicación crmsvcutil, incluyendo los siguientes parámetros

  crmsvcutil /url:http://<<organización>>/XRMServices/2011/Organization.svc 
  /o:<<class name>> /n:<<namespace>> /serviceContextName:<<context name>> 
  /codewriterfilter:SvcUtilFilter.CodeWriterFilter,SvcUtilFilter


- Ahora el fichero generado ocupará tan solo unos cientos KB y contendrá solo las clases específicas para nuestro desarrollo




Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

No hay comentarios:

Publicar un comentario