Partager via


Créer des extensions pour l’outil de génération de code

Vous pouvez étendre les fonctionnalités de l’outil de génération de code en spécifiant d’autres paramètres de ligne de commande et valeurs de paramètre. Pour spécifier un paramètre, ajoutez ce qui suit à la ligne de commande :

<*parametername*>:<*class name*>,<*assembly name*>

Notez que le nom de l’assembly ne contient pas l’extension .dll. Vous pouvez sinon ajouter la valeur équivalente au fichier de configuration au format :

<add key="<*parametername*>" value="<*class name*>,<*assembly name*>" />

Le tableau suivant répertorie les paramètres que vous pouvez utiliser.

Nom du paramètre Nom de l’interface Description
codecustomization ICustomizeCodeDomService Appelé à la fin de la génération de CodeDOM, en supposant l’instance par défaut de ICodeGenerationService. Ce paramètre est très utile pour générer des classes supplémentaires, telles que les constantes dans les listes déroulantes.
codewriterfilter ICodeWriterFilterService Appelé durant le processus de génération de CodeDOM, en supposant l’instance par défaut de ICodeGenerationService, pour déterminer si un objet ou une propriété spécifique doit être généré.
codewritermessagefilter ICodeWriterMessageFilterService Appelé durant le processus de génération de CodeDOM, en supposant l’instance par défaut de ICodeGenerationService, pour déterminer si un message spécifique doit être généré. Ce paramètre ne doit pas être utilisé pour les demandes/réponses, car celles-ci sont déjà générées dans Microsoft.Crm.Sdk.Proxy.dll et Microsoft.Xrm.Sdk.dll.
metadataproviderservice IMetadataProviderService Appelé pour récupérer les métadonnées du serveur. Ce paramètre peut être appelé plusieurs fois durant le processus de génération ; par conséquent, les données doivent être mises en cache.
codegenerationservice ICodeGenerationService Implémentation principale de la génération de CodeDOM. Si ce paramètre est modifié, les autres extensions peuvent ne pas se comporter de la manière décrite.
namingservice INamingService Appelé pendant la génération de CodeDOM pour déterminer le nom des objets, en supposant l’implémentation par défaut.

L’implémentation de ces interfaces doit avoir l’un des constructeurs suivants :

MyNamingService()
MyNamingService(INamingService defaultService)
MyNamingService(IDictionary<string, string> parameters)
MyNamingService(INamingService defaultService, IDictionary<string, string> parameters)

L’espace de noms Microsoft.Crm.Services.Utility est défini dans CrmSvcUtil.exe. Ajoutez une référence à CrmSvcUtil.exe dans vos projets d’extension de l’outil de génération de code Visual Studio.

Exemple d’extension pour générer des énumérations pour les choix (groupes d’options)

L’exemple de code suivant montre comment écrire une extension.

using System;

using Microsoft.Crm.Services.Utility;
using Microsoft.Xrm.Sdk.Metadata;

/// <summary>
/// Sample extension for the CrmSvcUtil.exe tool that generates early-bound
/// classes for custom entities.
/// </summary>
public sealed class BasicFilteringService : ICodeWriterFilterService
{
    public BasicFilteringService(ICodeWriterFilterService defaultService)
    {
        this.DefaultService = defaultService;
    }

    private ICodeWriterFilterService DefaultService { get; set; }

    bool ICodeWriterFilterService.GenerateAttribute(AttributeMetadata attributeMetadata, IServiceProvider services)
    {
        return this.DefaultService.GenerateAttribute(attributeMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateEntity(EntityMetadata entityMetadata, IServiceProvider services)
    {
        if (!entityMetadata.IsCustomEntity.GetValueOrDefault()) { return false; }
        return this.DefaultService.GenerateEntity(entityMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateOption(OptionMetadata optionMetadata, IServiceProvider services)
    {
        return this.DefaultService.GenerateOption(optionMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateOptionSet(OptionSetMetadataBase optionSetMetadata, IServiceProvider services)
    {
        return this.DefaultService.GenerateOptionSet(optionSetMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateRelationship(RelationshipMetadataBase relationshipMetadata, EntityMetadata otherEntityMetadata,
    IServiceProvider services)
    {
        return this.DefaultService.GenerateRelationship(relationshipMetadata, otherEntityMetadata, services);
    }

    bool ICodeWriterFilterService.GenerateServiceContext(IServiceProvider services)
    {
        return this.DefaultService.GenerateServiceContext(services);
    }
}

Téléchargez l’exemple CrmSvcUtilExtensions et GeneratePickListEnums.

L’exemple d’extension GeneratePicklistEnums génère un fichier de code source contenant des énumérations pour tous les groupes d’options, codes d’état et codes de statut.

Chaque énumération peut être utilisée pour tester ou définir la valeur d’une propriété. Généralement, cette propriété est une colonne de table (attribut d’entité), mais il y en a quelques-unes qui sont utilisées pour d’autres propriétés.

Exemple d’utilisation

L’exemple suivant montre comment utiliser l’une de ces énumérations pour définir une valeur dans un compte.

// Instantiate an account object. Note the use of the option set enumerations defined
// in OptionSets.cs.
Account account = new Account { Name = "Fourth Coffee" };
account.AccountCategoryCode = new OptionSetValue((int)AccountAccountCategoryCode.PreferredCustomer);
account.CustomerTypeCode = new OptionSetValue((int)AccountCustomerTypeCode.Investor);

// Create an account record named Fourth Coffee.
// Save the record reference so we can delete it during cleanup later.
Guid accountId = service.Create(account);

Voir aussi

Créer des classes d’entité à liaison anticipée à l’aide de l’outil de génération de code