Vorgehensweise: Schreiben einer Erweiterung für den ServiceContractGeneratorHow to: Write an Extension for the ServiceContractGenerator

In diesem Thema wird beschrieben, wie Sie eine Erweiterung für den ServiceContractGenerator schreiben können.This topic describes how to write an extension for the ServiceContractGenerator. Dies kann durch Implementieren der IOperationContractGenerationExtension-Schnittstelle für ein Vorgangsverhalten oder Implementieren der IServiceContractGenerationExtension-Schnittstelle für ein Vertragsverhalten geschehen.This can be done by implementing the IOperationContractGenerationExtension interface on an operation behavior or implementing the IServiceContractGenerationExtension interface on a contract behavior. In diesem Thema wird gezeigt, wie die IServiceContractGenerationExtension-Schnittstelle in einem Vertragsverhalten implementiert wird.This topic shows how to implement the IServiceContractGenerationExtension interface on a contract behavior.

Der ServiceContractGenerator erstellt aus ServiceEndpoint-Instanzen, ContractDescription-Instanzen und Binding-Instanzen Dienstverträge, Clienttypen und Clientkonfigurationen.The ServiceContractGenerator generates service contracts, client types, and client configurations from ServiceEndpoint, ContractDescription, and Binding instances. Normalerweise importieren Sie ServiceEndpoint-Instanzen, ContractDescription-Instanzen und Binding-Instanzen aus Dienstmetadaten und verwenden dann diese Instanzen, um den Code zum Aufrufen des Dienstes zu schreiben.Typically, you import ServiceEndpoint, ContractDescription, and Binding instances from service metadata and then use these instances to generate code to call the service. In diesem Beispiel wird eine IWsdlImportExtension-Implementierung zur Verarbeitung von WSDL-Anmerkungen verwendet. Dann werden Codegenerierungserweiterungen in die importierten Verträge eingefügt, um Kommentare zu dem generierten Code zu erstellen.In this example, an IWsdlImportExtension implementation is used to process WSDL annotations and then add code generation extensions to the imported contracts to generate comments on the generated code.

So schreiben Sie eine Erweiterung für den ServiceContractGeneratorTo write an extension for the ServiceContractGenerator

  1. Implementieren Sie IServiceContractGenerationExtension.Implement IServiceContractGenerationExtension. Verwenden Sie zum Bearbeiten des generierten Dienstvertrags die ServiceContractGenerationContext-Instanz, die an die GenerateContract(ServiceContractGenerationContext)-Methode weitergegeben wurde.To modify the generated service contract, use the ServiceContractGenerationContext instance passed into the GenerateContract(ServiceContractGenerationContext) method.

    public void GenerateContract(ServiceContractGenerationContext context)  
    {  
        Console.WriteLine("In generate contract.");  
    context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));  
    }  
    
  2. Implementieren Sie IWsdlImportExtension für die gleiche Klasse.Implement IWsdlImportExtension on the same class. Mit der ImportContract(WsdlImporter, WsdlContractConversionContext)-Methode kann eine bestimmte WSDL-Erweiterung (in diesem Fall WSDL-Anmerkungen) verarbeitet werden, indem eine Codegenerierungserweiterung der importierten ContractDescription-Instanz hinzugefügt wird.The ImportContract(WsdlImporter, WsdlContractConversionContext) method can process a specific WSDL extension (WSDL annotations in this case) by adding a code generation extension to the imported ContractDescription instance.

    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. Fügen Sie den WSDL-Importer in Ihre Clientkonfiguration ein.Add the WSDL importer to your client configuration.

    <metadata>  
      <wsdlImporters>  
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />  
      </wsdlImporters>  
    </metadata>  
    
  4. Erstellen Sie im Clientcode einen MetadataExchangeClient, und rufen Sie GetMetadata auf.In the client code, create a MetadataExchangeClient and call GetMetadata.

    MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress);  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet metaDocs = mexClient.GetMetadata();  
    
  5. Erstellen Sie einen WsdlImporter, und rufen Sie ImportAllContracts auf.Create a WsdlImporter and call ImportAllContracts.

    WsdlImporter importer = new WsdlImporter(metaDocs);            System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Erstellen Sie einen ServiceContractGenerator, und rufen Sie den GenerateServiceContractType für jeden Vertrag auf.Create a ServiceContractGenerator and call GenerateServiceContractType for each contract.

    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(ServiceContractGenerationContext) wird automatisch für jedes Vertragsverhalten für einen bestimmten Vertrag, der IServiceContractGenerationExtension implementiert, aufgerufen.GenerateContract(ServiceContractGenerationContext) is called automatically for each contract behavior on a given contract that implements IServiceContractGenerationExtension. Diese Methode kann dann den übergebenen ServiceContractGenerationContext ändern.This method can then modify the ServiceContractGenerationContext passed in. In diesem Beispiel werden Kommentare hinzugefügt.In this example comments are added.

Siehe auchSee Also

MetadatenMetadata
Vorgehensweise: Importieren von benutzerdefinierter WSDLHow to: Import Custom WSDL