Procedure: Een extensie schrijven voor de ServiceContractGenerator
In dit onderwerp wordt beschreven hoe u een extensie schrijft voor de ServiceContractGeneratorextensie . Dit kan worden gedaan door de IOperationContractGenerationExtension interface te implementeren op een bewerkingsgedrag of door de IServiceContractGenerationExtension interface op een contractgedrag te implementeren. In dit onderwerp wordt beschreven hoe u de IServiceContractGenerationExtension interface op een contractgedrag implementeert.
Hiermee ServiceContractGenerator worden servicecontracten, clienttypen en clientconfiguraties gegenereerd van ServiceEndpoint, ContractDescriptionen Binding exemplaren. Normaal gesproken importeert ServiceEndpoint, ContractDescriptionen Binding exemplaren uit servicemetagegevens en gebruikt u deze exemplaren om code te genereren om de service aan te roepen. In dit voorbeeld wordt een IWsdlImportExtension implementatie gebruikt om WSDL-aantekeningen te verwerken en vervolgens extensies voor het genereren van code toe te voegen aan de geïmporteerde contracten om opmerkingen over de gegenereerde code te genereren.
Een extensie schrijven voor de ServiceContractGenerator
Implementeren IServiceContractGenerationExtension. Als u het gegenereerde servicecontract wilt wijzigen, gebruikt u het ServiceContractGenerationContext exemplaar dat is doorgegeven aan de GenerateContract(ServiceContractGenerationContext) methode.
public void GenerateContract(ServiceContractGenerationContext context) { Console.WriteLine("In generate contract."); context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText)); }
Implementeer IWsdlImportExtension op dezelfde klasse. De ImportContract(WsdlImporter, WsdlContractConversionContext) methode kan in dit geval een specifieke WSDL-extensie (WSDL-aantekeningen) verwerken door een extensie voor het genereren van code toe te voegen aan het geïmporteerde ContractDescription exemplaar.
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."); }
Voeg de WSDL-importfunctie toe aan de clientconfiguratie.
<metadata> <wsdlImporters> <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" /> </wsdlImporters> </metadata>
Maak een
MetadataExchangeClient
en aanroepGetMetadata
in de clientcode.var mexClient = new MetadataExchangeClient(metadataAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaDocs = mexClient.GetMetadata();
Maak een
WsdlImporter
en roep een aanroepImportAllContracts
.var importer = new WsdlImporter(metaDocs); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
Maak een
ServiceContractGenerator
en oproepGenerateServiceContractType
voor elk contract.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) wordt automatisch aangeroepen voor elk contractgedrag voor een bepaald contract dat implementeert IServiceContractGenerationExtension. Met deze methode kunt u vervolgens de ServiceContractGenerationContext doorgegeven methode wijzigen. In dit voorbeeld worden opmerkingen toegevoegd.