[英]Consuming SOAP service by dependency injection
我一直在開發使用一些WCF服務的Silveright應用程序。 在WCF中,我有幾種不同的服務實現了相同的接口,例如:
public class Service1 : IService<Type1> {...}
public class Service2 : IService<Type2> {...}
我一直在考慮從客戶端應用程序(消費者)訪問IService
接口,以開發通用類,以最大程度地重復使用代碼以使用WCF服務,例如:
public class MyUnitedOPs<T> {
ServiceReference.IService<T> _object;
public MyUnitedOPs (ServiceReference.IService<T> _object) {
this._object = _object;
}
}
但是,顯然我無法直接訪問IService
接口,例如,它被稱為IServiceOf_Service1
。 盡管仍然可以BeginAdd
,但是我從此IServiceOf_Service1
獲得的方法與實現它的服務中提供的方法不同,例如,在實現它的服務中我具有BeginAdd
和EndAdd
而我只有一個AddAsync
方法。
因此,出於好奇,是否有可能做這樣的事情?
您不能使IService <T>遍歷客戶端,因為WSDL不支持此功能。
但是,您可以執行以下操作:
您看到BeginAdd和EndAdd的原因僅僅是客戶端的技術問題,它不會影響服務器上發生的任何事情。 從您的帖子中,我認為您的Add操作返回一個Task,這是從.net 4.5開始的WCF服務的高效異步實現。 即使您的操作返回了Task,但如果您檢查服務生成的WSDL,您也會看到您的操作實際上還返回了其他內容(一個int或一個字符串,或者某個DataContract,具體取決於您的實現)。 這是因為異步只是服務的實現細節,它不會更改合同 。 客戶可以通過三種不同的方式致電您的服務:
一種。 只需直接調用即可。 這意味着您的客戶端將阻止當前線程。
b。 使用APM異步模型,該模型利用BeginXXX和EndXXX之類的方法,這些方法將從另一個線程通過網絡發起實際的I / O請求, 而不像以前的選項那樣阻塞調用線程。
C。 使用TAP異步模型,該模型將Tasks與XXXAsync等方法結合使用。
您可以從Visual Studio的“添加服務引用”窗口中控制這些選項(a-c)以及許多其他選項(例如,用於集合的哪種集合類型?數組?列表?等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.