Sdílet prostřednictvím


Postupy: Vytvoření rozšíření pro třídu ServiceContractGenerator

Toto téma popisuje, jak napsat rozšíření pro ServiceContractGenerator. Můžete to provést implementací IOperationContractGenerationExtension rozhraní pro chování operace nebo implementací IServiceContractGenerationExtension rozhraní pro chování kontraktu. Toto téma ukazuje, jak implementovat IServiceContractGenerationExtension rozhraní pro chování kontraktu.

Generuje ServiceContractGenerator kontrakty služeb, typy klientů a konfigurace klientů z ServiceEndpoint, ContractDescriptiona Binding instancí. Obvykle importujete ServiceEndpoint, ContractDescriptiona Binding instance z metadat služby a pak tyto instance použijete k vygenerování kódu pro volání služby. V tomto příkladu se IWsdlImportExtension implementace používá ke zpracování poznámek WSDL a následné přidání rozšíření generování kódu do importovaných kontraktů, aby se vygenerovaly komentáře ke generovanému kódu.

Zápis rozšíření pro ServiceContractGenerator

  1. Implementovat IServiceContractGenerationExtension. Chcete-li upravit vygenerovaný kontrakt služby, použijte instanci předanou ServiceContractGenerationContext do GenerateContract(ServiceContractGenerationContext) metody.

    public void GenerateContract(ServiceContractGenerationContext context)  
    {  
        Console.WriteLine("In generate contract.");  
        context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));  
    }  
    
  2. Implementujte IWsdlImportExtension ve stejné třídě. Metoda ImportContract(WsdlImporter, WsdlContractConversionContext) může zpracovat konkrétní rozšíření WSDL (v tomto případě poznámky WSDL) přidáním rozšíření generování kódu do importované 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. Přidejte do konfigurace klienta import WSDL.

    <metadata>  
      <wsdlImporters>  
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />  
      </wsdlImporters>  
    </metadata>  
    
  4. V kódu klienta vytvořte MetadataExchangeClient a zavolejte GetMetadata.

    var mexClient = new MetadataExchangeClient(metadataAddress);  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet metaDocs = mexClient.GetMetadata();  
    
  5. Vytvořte WsdlImporter a zavolejte ImportAllContracts.

    var importer = new WsdlImporter(metaDocs);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Vytvořte ServiceContractGenerator pro každý kontrakt a volejte GenerateServiceContractType ho.

    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) je volána automaticky pro každé chování kontraktu u daného kontraktu, který implementuje IServiceContractGenerationExtension. Tato metoda pak může změnit předaný ServiceContractGenerationContext . V tomto příkladu jsou přidány komentáře.

Viz také