Procédure : écrire une extension pour le ServiceContractGenerator
Cette rubrique décrit comment écrire une extension pour le ServiceContractGenerator. Cela peut être fait en implémentant l'interface IOperationContractGenerationExtension sur un comportement d'opération ou en implémentant l'interface IServiceContractGenerationExtension sur un comportement de contrat. Cette rubrique indique comment implémenter l'interface IServiceContractGenerationExtension sur un comportement du contrat.
Le ServiceContractGenerator génère des contrats de service, des types de clients et des configurations clientes à partir d'instances ServiceEndpoint, ContractDescription et Binding. En général, vous importez des instances ServiceEndpoint, ContractDescription et Binding à partir de métadonnées de service, puis vous utilisez ces instances pour générer du code pour appeler le service. Dans cet exemple, une implémentation IWsdlImportExtension est utilisée pour traiter les annotations WSDL puis ajouter des extensions de génération de code aux contrats importés afin de produire des commentaires sur le code généré.
Pour écrire une extension pour le ServiceContractGenerator
Implémentez IServiceContractGenerationExtension. Pour modifier le contrat de service généré, utilisez l'instance ServiceContractGenerationContext passée dans la méthode GenerateContract(ServiceContractGenerationContext).
public void GenerateContract(ServiceContractGenerationContext context) { Console.WriteLine("In generate contract."); context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText)); }
Implémentez IWsdlImportExtension sur la même classe. La méthode ImportContract(WsdlImporter, WsdlContractConversionContext) peut traiter une extension WSDL spécifique (annotations WSDL dans ce cas) en ajoutant une extension de génération de code à l'instance ContractDescription importée.
public void ImportContract(WsdlImporter importer, WsdlContractConversionContext context) { // Contract documentation if (context.WsdlPortType.Documentation != null) { context.Contract.Behaviors.Add(new WsdlDocumentationImporter(context.WsdlPortType.Documentation)); } // Operation documentation foreach (Operation operation in context.WsdlPortType.Operations) { if (operation.Documentation != null) { OperationDescription operationDescription = context.Contract.Operations.Find(operation.Name); if (operationDescription != null) { operationDescription.Behaviors.Add(new WsdlDocumentationImporter(operation.Documentation)); } } } } public void BeforeImport(ServiceDescriptionCollection wsdlDocuments, XmlSchemaSet xmlSchemas, ICollection<XmlElement> policy) { Console.WriteLine("BeforeImport called."); } public void ImportEndpoint(WsdlImporter importer, WsdlEndpointConversionContext context) { Console.WriteLine("ImportEndpoint called."); }
Ajoutez l'importateur WSDL à votre configuration cliente :
<metadata> <wsdlImporters> <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" /> </wsdlImporters> </metadata>
Dans le code client, créez un
MetadataExchangeClient
et appelezGetMetadata
.var mexClient = new MetadataExchangeClient(metadataAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaDocs = mexClient.GetMetadata();
Créez un
WsdlImporter
et appelezImportAllContracts
.var importer = new WsdlImporter(metaDocs); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
Créez un
ServiceContractGenerator
et appelezGenerateServiceContractType
pour chaque contrat.var generator = new ServiceContractGenerator(); foreach (ContractDescription contract in contracts) { generator.GenerateServiceContractType(contract); } if (generator.Errors.Count != 0) throw new Exception("There were errors during code compilation.");
GenerateContract(ServiceContractGenerationContext) est appelée automatiquement pour chaque comportement de contrat sur un contrat donné qui implémente IServiceContractGenerationExtension. Cette méthode peut ensuite modifier le ServiceContractGenerationContext passé. Dans cet exemple les commentaires sont ajoutés.