Megosztás a következőn keresztül:


Útmutató: Bővítmény írása a ServiceContractGeneratorhoz

Ez a témakör azt ismerteti, hogyan írhat bővítményt a ServiceContractGenerator. Ezt úgy teheti meg, hogy az IOperationContractGenerationExtension interfészt egy műveleti viselkedésen implementálja, vagy egy szerződési viselkedésen implementálja az IServiceContractGenerationExtension interfészt. Ez a témakör bemutatja, hogyan implementálhatja a IServiceContractGenerationExtension felületet egy szerződési viselkedésen.

A ServiceContractGenerator rendszer szolgáltatásszerződéseket, ügyféltípusokat és ügyfélkonfigurációkat ServiceEndpointhoz létre , ContractDescriptionés Binding példányokból. Általában a szolgáltatás metaadataiból importálServiceEndpointContractDescription, és Binding példányokat hoz létre, majd ezekkel a példányokkal generál kódot a szolgáltatás meghívásához. Ebben a példában egy IWsdlImportExtension implementációval dolgozzák fel a WSDL-széljegyzeteket, majd kódgenerálási bővítményeket adnak hozzá az importált szerződésekhez, hogy megjegyzéseket fűzhessenek a létrehozott kódhoz.

Bővítmény írása a ServiceContractGeneratorhoz

  1. Implementálás IServiceContractGenerationExtension. A létrehozott szolgáltatási szerződés módosításához használja a ServiceContractGenerationContext metódusnak átadott példányt GenerateContract(ServiceContractGenerationContext) .

    public void GenerateContract(ServiceContractGenerationContext context)  
    {  
        Console.WriteLine("In generate contract.");  
        context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));  
    }  
    
  2. Implementálás IWsdlImportExtension ugyanazon az osztályon. A ImportContract(WsdlImporter, WsdlContractConversionContext) metódus feldolgozhat egy adott WSDL-bővítményt (ebben az esetben WSDL-széljegyzeteket) úgy, hogy hozzáad egy kódgenerálási bővítményt az importált ContractDescription példányhoz.

    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. Adja hozzá a WSDL-importálót az ügyfélkonfigurációhoz.

    <metadata>  
      <wsdlImporters>  
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />  
      </wsdlImporters>  
    </metadata>  
    
  4. Az ügyfélkódban hozzon létre egy és egy MetadataExchangeClient hívást GetMetadata.

    var mexClient = new MetadataExchangeClient(metadataAddress);  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet metaDocs = mexClient.GetMetadata();  
    
  5. Hozzon létre egy WsdlImporter és egy hívást ImportAllContracts.

    var importer = new WsdlImporter(metaDocs);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Hozzon létre és ServiceContractGenerator hívjon meg GenerateServiceContractType minden szerződést.

    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) a rendszer automatikusan meghívja a rendszer az adott szerződés minden olyan viselkedéséhez, amely megvalósítja a IServiceContractGenerationExtension. Ez a metódus ezután módosíthatja az ServiceContractGenerationContext átadott fájlokat. Ebben a példában megjegyzéseket adunk hozzá.

Lásd még