Partager via


Comment : é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

  1. Implémentez IServiceContractGenerationExtension. Pour modifier le contrat de service généré, utilisez l'instance ServiceContractGenerationContext passée dans la méthode GenerateContract.

    public void GenerateContract(ServiceContractGenerationContext context)
    {
        Console.WriteLine("In generate contract.");
    context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));
    }
    
  2. Implémentez IWsdlImportExtension sur la même classe. La méthode ImportContract 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.");
            }
    
  3. Ajoutez l'importateur WSDL à votre configuration cliente :

    <metadata>
      <wsdlImporters>
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />
      </wsdlImporters>
    </metadata>
    
  4. Dans le code client, créez un MetadataExchangeClient et appelez GetMetadata.

                MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress);
                mexClient.ResolveMetadataReferences = true;
                MetadataSet metaDocs = mexClient.GetMetadata();
    
  5. Créez un WsdlImporter et appelez ImportAllContracts.

    WsdlImporter importer = new WsdlImporter(metaDocs);            System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
    
  6. Créez un ServiceContractGenerator et appelez GenerateServiceContractType pour chaque contrat.

    ServiceContractGenerator 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.");
    
  7. GenerateContract 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, des commentaires sont ajoutés.

Voir aussi

Tâches

Comment : importer un fichier WSDL personnalisé

Concepts

Métadonnées