Postupy: Vytvoření rozšíření pro třídu ServiceContractGenerator
Toto téma popisuje, jak napsat rozšíření pro ServiceContractGenerator. Můžete to provést implementací IOperationContractGenerationExtension rozhraní pro chování operace nebo implementací IServiceContractGenerationExtension rozhraní pro chování kontraktu. Toto téma ukazuje, jak implementovat IServiceContractGenerationExtension rozhraní pro chování kontraktu.
Generuje ServiceContractGenerator kontrakty služeb, typy klientů a konfigurace klientů z ServiceEndpoint, ContractDescriptiona Binding instancí. Obvykle importujete ServiceEndpoint, ContractDescriptiona Binding instance z metadat služby a pak tyto instance použijete k vygenerování kódu pro volání služby. V tomto příkladu se IWsdlImportExtension implementace používá ke zpracování poznámek WSDL a následné přidání rozšíření generování kódu do importovaných kontraktů, aby se vygenerovaly komentáře ke generovanému kódu.
Zápis rozšíření pro ServiceContractGenerator
Implementovat IServiceContractGenerationExtension. Chcete-li upravit vygenerovaný kontrakt služby, použijte instanci předanou ServiceContractGenerationContext do GenerateContract(ServiceContractGenerationContext) metody.
public void GenerateContract(ServiceContractGenerationContext context) { Console.WriteLine("In generate contract."); context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText)); }
Implementujte IWsdlImportExtension ve stejné třídě. Metoda ImportContract(WsdlImporter, WsdlContractConversionContext) může zpracovat konkrétní rozšíření WSDL (v tomto případě poznámky WSDL) přidáním rozšíření generování kódu do importované ContractDescription instance.
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."); }
Přidejte do konfigurace klienta import WSDL.
<metadata> <wsdlImporters> <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" /> </wsdlImporters> </metadata>
V kódu klienta vytvořte
MetadataExchangeClient
a zavolejteGetMetadata
.var mexClient = new MetadataExchangeClient(metadataAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaDocs = mexClient.GetMetadata();
Vytvořte
WsdlImporter
a zavolejteImportAllContracts
.var importer = new WsdlImporter(metaDocs); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
Vytvořte
ServiceContractGenerator
pro každý kontrakt a volejteGenerateServiceContractType
ho.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.");
GenerateContract(ServiceContractGenerationContext) je volána automaticky pro každé chování kontraktu u daného kontraktu, který implementuje IServiceContractGenerationExtension. Tato metoda pak může změnit předaný ServiceContractGenerationContext . V tomto příkladu jsou přidány komentáře.