Freigeben über


Erstellen von Erweiterungen für das Codegenerierungstool

Sie können die Funktionalität des Codegenerierungstools erweitern, indem Sie zusätzliche Befehlszeilenparameter und Parameterwerte angeben. Fügen Sie der Befehlszeile Folgendes hinzu, um einen Parameter anzugeben:

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

Beachten Sie, dass assembly name nicht die .dll-Erweiterung enthält. Alternativ können Sie den Gegenwert der CONFIG-Datei im folgenden Format hinzufügen:

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

In der folgenden Tabelle werden die Parameter aufgeführt, die Sie verwenden können:

Parametername Schnittstellenname Beschreibung
codecustomization ICustomizeCodeDomService Aufgerufen, nachdem die CodeDOM-Generierung abgeschlossen wurde, nimmt die Standardinstanz von ICodeGenerationService an. Dies ist nützlich zum Erstellen von zusätzlichen Klassen, wie die Konstanten in Auswahllisten.
codewriterfilter ICodeWriterFilterService Angerufen während des Vorgangs der CodeDOM-Generierung, nimmt die Standardinstanz von ICodeGenerationService an, um zu bestimmen, ob ein bestimmtes Objekt oder eine Eigenschaft generiert werden soll.
codewritermessagefilter ICodeWriterMessageFilterService Angerufen während des Vorgangs der CodeDOM-Generierung, nimmt die Standardinstanz von ICodeGenerationService an, um zu bestimmen, ob eine bestimmte Nachricht generiert werden soll. Dies sollte nicht verwendet für Anforderungen und Antworten, da diese bereits in Microsoft.Crm.Sdk.Proxy.dll und in Microsoft.Xrm.Sdk.dll generiert werden.
metadataproviderservice IMetadataProviderService Aufgerufen, um Metadaten vom Server abzurufen. Dies kann mehrmals während des Generierungsprozesses aufgerufen werden, daher sollten die Daten zwischengespeichert werden.
codegenerationservice ICodeGenerationService Kernimplementierung der CodeDOM-Generierung. Wenn dieses geändert wird, verhalten sich unter Umständen die anderen Erweiterungen nicht in der beschriebenen Weise.
namingservice INamingService Angerufen während der CodeDOM-Generierung, um den Namen für Objekte zu bestimmen, die Standardimplementierung vorausgesetzt.

Die Implementierung dieser Schnittstellen muss einen der folgenden Konstruktoren haben:

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

Der Microsoft.Crm.Services.Utility-Namespace wird in CrmSvcUtil.exe definiert. Fügen einen Verweis auf CrmSvcUtil.exe in Ihren Visual Studio-Codegenerierungstool-Erweiterungsprojekten hinzu.

Beispielerweiterung zum Generieren von Aufzählungen für Auswahlmöglichkeiten (Optionssätze)

Der folgende Beispielcode zeigt, wie eine Erweiterung geschrieben wird.

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);
    }
}

Laden Sie das Beispiel herunter: CrmSvcUtilExtensions und GeneratePickListEnums.

Die GeneratePicklistEnums-Beispielerweiterung gibt eine Quellcodedatei aus, die Enumerationn fü alle Optionssätze, Zustandscodes und Statuscodes enthält.

Jede Enumeration kann dazu verwendet werden, den Wert für eine Eigenschaft zu testen oder festzulegen. Normalerweise handelt es sich bei dieser Eigenschaft um eine Tabellenspalte (Entitätsattribut), aber es gibt einige, die für andere Eigenschaften verwendet werden.

Verwendungsbeispiel

Das folgende Beispiel zeigt, wie Sie eine dieser Aufzählungen verwenden, um einen Wert in einem Konto festzulegen.

// 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);

Siehe auch

Entitätsklassen mit früher Bindung mit dem Codegenerierungstool erstellen