Partager via


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

  1. 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));  
    }  
    
  2. 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.");
    }
    
  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.

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

    var importer = new WsdlImporter(metaDocs);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Créez un ServiceContractGenerator et appelez GenerateServiceContractType 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.");  
    
  7. 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.

Voir aussi