Udostępnij za pośrednictwem


Instrukcje: Pisanie rozszerzenia dla elementu ServiceContractGenerator

W tym temacie opisano sposób pisania rozszerzenia dla elementu ServiceContractGenerator. Można to zrobić przez zaimplementowanie interfejsu IOperationContractGenerationExtension w zachowaniu operacji lub zaimplementowanie interfejsu w zachowaniu IServiceContractGenerationExtension kontraktu. W tym temacie pokazano, jak zaimplementować IServiceContractGenerationExtension interfejs w zachowaniu kontraktu.

Generuje ServiceContractGenerator kontrakty usług, typy klientów i konfiguracje klientów z ServiceEndpointwystąpień , ContractDescriptioni Binding . Zazwyczaj importujesz ServiceEndpointwystąpienia , ContractDescriptioni Binding z metadanych usługi, a następnie używasz tych wystąpień do generowania kodu w celu wywołania usługi. W tym przykładzie implementacja IWsdlImportExtension służy do przetwarzania adnotacji WSDL, a następnie dodawania rozszerzeń generowania kodu do zaimportowanych kontraktów w celu generowania komentarzy na temat wygenerowanego kodu.

Aby napisać rozszerzenie dla elementu ServiceContractGenerator

  1. Zaimplementuj .IServiceContractGenerationExtension Aby zmodyfikować wygenerowany kontrakt usługi, użyj ServiceContractGenerationContext wystąpienia przekazanego GenerateContract(ServiceContractGenerationContext) do metody .

    public void GenerateContract(ServiceContractGenerationContext context)  
    {  
        Console.WriteLine("In generate contract.");  
        context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));  
    }  
    
  2. Zaimplementuj IWsdlImportExtension w tej samej klasie. Metoda ImportContract(WsdlImporter, WsdlContractConversionContext) może przetworzyć określone rozszerzenie WSDL (adnotacje WSDL w tym przypadku), dodając rozszerzenie generowania kodu do zaimportowanego ContractDescription wystąpienia.

    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. Dodaj importerA WSDL do konfiguracji klienta.

    <metadata>  
      <wsdlImporters>  
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />  
      </wsdlImporters>  
    </metadata>  
    
  4. W kodzie klienta utwórz element i wywołaj metodę MetadataExchangeClientGetMetadata.

    var mexClient = new MetadataExchangeClient(metadataAddress);  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet metaDocs = mexClient.GetMetadata();  
    
  5. Utwórz element i wywołaj metodę WsdlImporterImportAllContracts.

    var importer = new WsdlImporter(metaDocs);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Utwórz element ServiceContractGenerator i wywołaj GenerateServiceContractType dla każdego kontraktu.

    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) Jest wywoływany automatycznie dla każdego zachowania kontraktu w danym kontrakcie, który implementuje IServiceContractGenerationExtension. Ta metoda może następnie zmodyfikować ServiceContractGenerationContext przekazany element . W tym przykładzie dodawane są komentarze.

Zobacz też