Compartir a través de


Procedimiento para escribir una extensión para ServiceContractGenerator

En este tema se describe cómo escribir una extensión para ServiceContractGenerator. Esto se puede hacer implementando la interfaz IOperationContractGenerationExtension en un comportamiento de la operación o implementando la interfaz IServiceContractGenerationExtension en un comportamiento del contrato. En este tema se muestra cómo implementar la interfaz IServiceContractGenerationExtension en un comportamiento de contrato.

ServiceContractGenerator genera contratos de servicio, tipos de cliente y configuraciones de cliente a partir de instancias de ServiceEndpoint, ContractDescription y Binding. Normalmente, importa ServiceEndpoint, ContractDescription, y Binding crea instancias a partir de los metadatos del servicio y, a continuación, utiliza estas instancias para generar el código para llamar al servicio. En este ejemplo, se usa una implementación IWsdlImportExtension para procesar las anotaciones WSDL y después agregar las extensiones de generación de código a los contratos importados para generar comentarios en el código generado.

Escribir una extensión para ServiceContractGenerator

  1. Implemente IServiceContractGenerationExtension. Para modificar el contrato de servicio generado, use la instancia ServiceContractGenerationContext pasada al método GenerateContract(ServiceContractGenerationContext).

    public void GenerateContract(ServiceContractGenerationContext context)  
    {  
        Console.WriteLine("In generate contract.");  
        context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));  
    }  
    
  2. Implemente IWsdlImportExtension en la misma clase. El método ImportContract(WsdlImporter, WsdlContractConversionContext) puede procesar una extensión WSDL concreta (anotaciones WSDL en este caso) agregando una extensión de generación de código a la instancia ContractDescription importada.

    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. Agregue el importador de WSDL a su configuración de cliente.

    <metadata>  
      <wsdlImporters>  
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />  
      </wsdlImporters>  
    </metadata>  
    
  4. En el código de cliente, cree un MetadataExchangeClient y llame a GetMetadata:

    var mexClient = new MetadataExchangeClient(metadataAddress);  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet metaDocs = mexClient.GetMetadata();  
    
  5. Cree un WsdlImporter y llame a ImportAllContracts:

    var importer = new WsdlImporter(metaDocs);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Cree un ServiceContractGenerator y llame a GenerateServiceContractType para cada contrato.

    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. Se llama a GenerateContract(ServiceContractGenerationContext) automáticamente para cada comportamiento del contrato en un contrato determinado que implementa IServiceContractGenerationExtension. Este método puede modificar el ServiceContractGenerationContext pasado. En este ejemplo se agregan comentarios.

Vea también