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