Partage 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 des paramètres de ligne de commande et des valeurs de paramètre supplémentaires. 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 n’inclut pas l’extension .dll. Comme alternative, vous pouvez 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 Descriptif
codecustomization ICustomizeCodeDomService Appelé à la fin de la génération de CodeDOM, en supposant l’instance par défaut de ICodeGenerationService. Il est utile pour générer des classes supplémentaires, telles que les constantes dans les listes de sélection.
codewriterfilter ICodeWriterFilterService Appelé pendant 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é pendant 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é. Cela 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. Il peut être appelé plusieurs fois au cours du processus de génération, de sorte que les données doivent être mises en cache.
codegenerationservice ICodeGenerationService Implémentation principale de la génération de CodeDOM. Si cela est modifié, les autres extensions peuvent ne pas se comporter de la manière décrite.
namingservice INamingService Appelé lors de 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 d’outil de génération de code Visual Studio.

Exemple d’extension pour générer des énumérations pour les choix (jeux 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 qui contient des énumérations pour tous les groupes d’options, les codes d’état et les codes d’état.

Chaque énumération peut être utilisée pour tester ou définir la valeur d’une propriété. En règle générale, cette propriété est une colonne de table (attribut d’entité), mais quelques-unes 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