コード生成ツール用の拡張機能の作成
追加のコマンドライン パラメーターとパラメーター値を指定することで、コード生成ツールの機能を拡張できます。 パラメーターを指定するには、コマンド ラインに以下を追加します:
<*parametername*>:<*class name*>,<*assembly name*>
アセンブリ名に .dll 拡張子を含めないことに注意してください。 または、次の形式で同等の値を構成ファイルに追加することもできます:
<add key="<*parametername*>" value="<*class name*>,<*assembly name*>" />
使用できるパラメーターを次の表に示します。
パラメーター名 | インターフェイス名 | Description |
---|---|---|
codecustomization |
ICustomizeCodeDomService |
CodeDOM の生成が完成した後で呼び出されます (ICodeGenerationService の既定のインスタンスを使用すると仮定します)。 候補リスト内の定数など、追加のクラスを生成するには便利です。 |
codewriterfilter |
ICodeWriterFilterService |
特定のオブジェクトまたはプロパティを生成するかどうかを判断するために CodeDOM の生成中に呼び出されます (ICodeGenerationService の既定のインスタンスを使用すると仮定します)。 |
codewritermessagefilter |
ICodeWriterMessageFilterService |
特定のメッセージを生成するかどうかを判断するために CodeDOM の生成中に呼び出されます (ICodeGenerationService の既定のインスタンスを使用すると仮定します)。 Microsoft.Crm.Sdk.Proxy.dll および Microsoft.Xrm.Sdk.dll で既に生成済みであるため、これは要求/応答で使用しないでください。 |
metadataproviderservice |
IMetadataProviderService |
サーバーからメタデータを取得するために呼び出されます。 生成プロセス中に複数回呼び出されることがあるため、データはキャッシュに保存する必要があります。 |
codegenerationservice |
ICodeGenerationService |
CodeDOM 生成の中心的な実装部分。 これを変更した場合、他の拡張機能が説明どおりに動作しなくなる可能性があります。 |
namingservice |
INamingService |
オブジェクトの名前を確認するために CodeDOM 生成中に呼び出されます (既定の実装を使用すると仮定します)。 |
これらのインターフェイスの実装には、次のいずれかのコンストラクターが含まれる必要があります。
MyNamingService()
MyNamingService(INamingService defaultService)
MyNamingService(IDictionary<string, string> parameters)
MyNamingService(INamingService defaultService, IDictionary<string, string> parameters)
Microsoft.Crm.Services.Utility
名前空間は、CrmSvcUtil.exe で定義されています。 CrmSvcUtil.exe の参照を Visual Studio コード生成ツール拡張機能プロジェクトに追加します。
選択肢 (オプションセット) の列挙を生成するためのサンプル拡張
次のコード例は、拡張機能の作成方法を示しています。
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);
}
}
サンプルのダウンロード: CrmSvcUtilExtensions および GeneratePickListEnums。
GeneratePicklistEnums サンプル拡張機能は、すべてのオプション セット、状態コード、およびステータス コードの列挙を含むソース コード ファイルを出力します。
各列挙体を使用して、プロパティの値をテストまたは設定することができます。 通常、このプロパティはテーブル列 (エンティティ属性) ですが、他のプロパティに使用されるものもいくつかあります。
使用例
次の例は、これらの列挙の1つを使用してアカウントに値を設定する方法を示しています。
// 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);