作法:撰寫 ServiceContractGenerator 的延伸模組
本主題說明如何撰寫 ServiceContractGenerator 的擴充。 您可以在作業行為上實作 IOperationContractGenerationExtension 介面,或在合約行為上實作 IServiceContractGenerationExtension 介面來達到這個目的。 本主題說明如何在合約行為上實作 IServiceContractGenerationExtension 介面。
ServiceContractGenerator 會從 ServiceEndpoint、ContractDescription 和 Binding 執行個體中產生服務合約、用戶端類型,與用戶端組態。 一般來說,您可以從服務中繼資料匯入 ServiceEndpoint、ContractDescription,和 Binding 執行個體,然後使用這些執行個體來產生程式碼以呼叫服務。 此範例會使用 IWsdlImportExtension 實作來處理 WSDL 附註,然後將程式碼產生擴充加入至匯入的合約中,以便在產生的程式碼中產生註解。
若要撰寫 ServiceContractGenerator 的擴充
實作 IServiceContractGenerationExtension。 若要修改產生的服務合約,請使用已傳入至 ServiceContractGenerationContext 方法的 GenerateContract(ServiceContractGenerationContext) 執行個體。
public void GenerateContract(ServiceContractGenerationContext context) { Console.WriteLine("In generate contract."); context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText)); }
在相同類別上實作 IWsdlImportExtension。 ImportContract(WsdlImporter, WsdlContractConversionContext) 方法可以處理特定的 WSDL 擴充 (在此情況下為 WSDL 附註),方法是將程式碼產生擴充加入至下列匯入的 ContractDescription 執行個體。
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."); }
將 WSDL 匯入工具加入至您的用戶端組態。
<metadata> <wsdlImporters> <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" /> </wsdlImporters> </metadata>
在用戶端程式碼中,建立
MetadataExchangeClient
並呼叫GetMetadata
。var mexClient = new MetadataExchangeClient(metadataAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaDocs = mexClient.GetMetadata();
建立
WsdlImporter
並呼叫ImportAllContracts
。var importer = new WsdlImporter(metaDocs); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
為每個合約建立
ServiceContractGenerator
並呼叫GenerateServiceContractType
。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) 的特定合約上,會針對每個合約行為自動呼叫 IServiceContractGenerationExtension。 這個方法會接著修改傳入的 ServiceContractGenerationContext。 在這個範例中會加入註解。