簡體   English   中英

通過依賴注入來消耗SOAP服務

[英]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獲得的方法與實現它的服務中提供的方法不同,例如,在實現它的服務中我具有BeginAddEndAdd而我只有一個AddAsync方法。

因此,出於好奇,是否有可能做這樣的事情?

您不能使IService <T>遍歷客戶端,因為WSDL不支持此功能。

但是,您可以執行以下操作:

  1. 您可以在服務器端擁有通用服務合同。
  2. 您還可以在服務器端具有通用服務實現。 (您不必創建Service1和Service2,可以堅持使用Service <T>)
  3. 您可以托管通用服務的多個具體實例,每個實例具有不同的類型。
  4. 客戶可以引用您的一項或多項托管服務,並且每一項都會產生具體的代理。
  5. 您看到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM