Aracılığıyla paylaş


Nasıl yapılır: ServiceContractGenerator için UzantıYazma

Bu konuda, için ServiceContractGeneratorbir uzantının nasıl yazıldığı açıklanmaktadır. Bu işlem davranışında IOperationContractGenerationExtension arabirimi uygulayarak veya arabirimi bir sözleşme davranışında IServiceContractGenerationExtension uygulayarak yapılabilir. Bu konu başlığında, arabirimin IServiceContractGenerationExtension bir sözleşme davranışına nasıl uygulanacakları gösterilmektedir.

, ServiceContractGenerator ve örneklerinden ServiceEndpointContractDescriptionhizmet sözleşmeleri, istemci türleri ve Binding istemci yapılandırmaları oluşturur. Genellikle, hizmet meta verilerinden , ContractDescriptionve Binding örneklerini içeri aktarır ServiceEndpointve ardından hizmeti çağırmak için kod oluşturmak için bu örnekleri kullanırsınız. Bu örnekte, WSDL ek açıklamalarını işlemek ve ardından oluşturulan kod üzerinde açıklamalar oluşturmak üzere içeri aktarılan sözleşmelere kod oluşturma uzantıları eklemek için bir IWsdlImportExtension uygulama kullanılır.

ServiceContractGenerator için uzantı yazmak için

  1. uygulayın IServiceContractGenerationExtension. Oluşturulan hizmet sözleşmesini değiştirmek için yöntemine ServiceContractGenerationContextGenerateContract(ServiceContractGenerationContext) geçirilen örneği kullanın.

    public void GenerateContract(ServiceContractGenerationContext context)  
    {  
        Console.WriteLine("In generate contract.");  
        context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));  
    }  
    
  2. Aynı sınıfta uygulayın IWsdlImportExtension . yöntemi, ImportContract(WsdlImporter, WsdlContractConversionContext) içeri aktarılan ContractDescription örneğe bir kod oluşturma uzantısı ekleyerek belirli bir WSDL uzantısını (bu örnekte WSDL ek açıklamaları) işleyebilir.

    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. WSDL içeri aktarıcısını istemci yapılandırmanıza ekleyin.

    <metadata>  
      <wsdlImporters>  
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />  
      </wsdlImporters>  
    </metadata>  
    
  4. İstemci kodunda bir MetadataExchangeClient oluşturun ve öğesini çağırın GetMetadata.

    var mexClient = new MetadataExchangeClient(metadataAddress);  
    mexClient.ResolveMetadataReferences = true;  
    MetadataSet metaDocs = mexClient.GetMetadata();  
    
  5. bir WsdlImporter ve çağrısı ImportAllContractsoluşturun.

    var importer = new WsdlImporter(metaDocs);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();  
    
  6. Her sözleşme için bir ServiceContractGenerator ve çağrısı GenerateServiceContractType oluşturun.

    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) , uygulamasını uygulayan belirli bir sözleşmedeki her sözleşme davranışı için otomatik olarak çağrılır IServiceContractGenerationExtension. Bu yöntem daha sonra geçirilen öğesini ServiceContractGenerationContext değiştirebilir. Bu örnekte açıklamalar eklenir.

Ayrıca bkz.