Dela via


Gör så här: Skriva ett tillägg för ServiceContractGenerator

Det här avsnittet beskriver hur du skriver ett tillägg för ServiceContractGenerator. Detta kan göras genom att implementera IOperationContractGenerationExtension gränssnittet på ett åtgärdsbeteende eller implementera IServiceContractGenerationExtension gränssnittet på ett kontraktbeteende. Det här avsnittet visar hur du implementerar IServiceContractGenerationExtension gränssnittet på ett kontraktsbeteende.

ServiceContractGenerator Genererar tjänstkontrakt, klienttyper och klientkonfigurationer från ServiceEndpoint, ContractDescriptionoch Binding instanser. Vanligtvis importerar ServiceEndpointdu , ContractDescriptionoch Binding instanser från tjänstmetadata och använder sedan dessa instanser för att generera kod för att anropa tjänsten. I det här exemplet används en IWsdlImportExtension implementering för att bearbeta WSDL-anteckningar och sedan lägga till kodgenereringstillägg till de importerade kontrakten för att generera kommentarer om den genererade koden.

Skriva ett tillägg för ServiceContractGenerator

  1. Implementera IServiceContractGenerationExtension. Om du vill ändra det genererade tjänstkontraktet använder du den instans som ServiceContractGenerationContext skickades till GenerateContract(ServiceContractGenerationContext) metoden.

    public void GenerateContract(ServiceContractGenerationContext context)  
    {  
        Console.WriteLine("In generate contract.");  
        context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));  
    }  
    
  2. Implementera IWsdlImportExtension i samma klass. Metoden ImportContract(WsdlImporter, WsdlContractConversionContext) kan bearbeta ett specifikt WSDL-tillägg (WSDL-anteckningar i det här fallet) genom att lägga till ett kodgenereringstillägg i den importerade ContractDescription instansen.

    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. Lägg till WSDL-importören i klientkonfigurationen.

    <metadata>  
      <wsdlImporters>  
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />  
      </wsdlImporters>  
    </metadata>  
    
  4. I klientkoden skapar du en MetadataExchangeClient och anropar GetMetadata.

    var mexClient = new MetadataExchangeClient(metadataAddress);  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet metaDocs = mexClient.GetMetadata();  
    
  5. Skapa en WsdlImporter och anropa ImportAllContracts.

    var importer = new WsdlImporter(metaDocs);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Skapa ett ServiceContractGenerator och anropa GenerateServiceContractType för varje kontrakt.

    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) anropas automatiskt för varje kontraktsbeteende på ett visst kontrakt som implementerar IServiceContractGenerationExtension. Den här metoden kan sedan ändra den ServiceContractGenerationContext skickade in. I det här exemplet läggs kommentarer till.

Se även