2011-05-16 131 views
2

我正在構建一組控制檯應用程序,所有這些應用程序都需要引用Web服務。我有一個類庫,其中包含這些應用程序的大部分共享功能,包括Web服務(已作爲服務參考添加)。我知道處理這個問題的「正確」方法是將塊從類庫的app.config複製到每個控制檯應用程序,但這會導致維護頭痛。我還找到了使用共享app.config文件的替代方法,並從每個應用程序的配置中引用它。這更好,但仍然不是很好 - 它仍然需要手動配置每個新應用程序,並要求我確保共享配置文件位於所有應用程序均可訪問的位置。封裝服務參考

我正在尋找的是以下三種情況之一(以下降的滿意度爲序):

  1. 的一種方式封裝的全程服務,以及一切必要對其進行訪問,到這是一個從生產的dll類庫。
  2. 一種將相關配置信息自動複製到每個控制檯應用程序的構建目錄(如構建後腳本)的方法。
  3. 解釋爲什麼前兩者都不可行。 (在這種情況下,我將使用共享配置)

有什麼建議嗎?

+0

'封裝整個服務'? – Nix 2011-05-16 16:37:49

+0

非常。控制檯應用程序根本不需要看到該服務是否存在。他們只需要使用庫中的類來完成他們的工作。事實上,這些類中發生的部分事情涉及Web服務與他們無關,並可能在以後發生變化。 – Bobson 2011-05-16 16:41:17

+0

因此,它涉及到創建一個API並使其適應服務。你會在你的問題中談論很多關於配置文件的問題,但是從來沒有提到你要用服務來做什麼(這就是爲什麼我要問的原因;)) – Nix 2011-05-16 16:45:03

回答

1

經過一段時間的工作其他事情後,我回到這個問題,並找到了一個相關的問題here。 Trond對這個問題的回答對我來說工作得很好,而且比其他任何事情都簡單得多。

3

誠實2是微不足道的。您可以輕鬆地將配置文件複製到構建目錄。一個簡單的谷歌搜索可以給你你需要的一切。

對於第1部分,您可以在此處選擇,我會建議您只需在界面窗體中爲您的服務定義API。然後使用DI通過dll插入「實現」。它始終使用Adapter Pattern,然後使用諸如Unity之類的東西來實現運行時。

僞:

interface IMyServiceAdaptor { 
    void SomeMethod(params); 
    void SomeMethod2(params); 
} 

public class ServiceAdaptor : IMyServiceAdaptor{ 
    #psudo code 
    ServiceProxyClient client { get;set;} 

    public void SomeMethod(parms){ 
     var convertedParams = Convert(parms); 
     return client.SomeMethod(convertedParams); 
    } 
    ...etc 

} 

public class MyClient { 
    [Dependancy] 
    IMyServiceAgent agent { get;set;} 

    public MyClient(){ 
    #resolve 
} 

}


概念是簡單的。您有一個服務的內部表示(IMyServiceAdaptor)。重要的是它完全獨立於實際調用您的服務的底層代理(服務引用)調用。這個想法是你爲你的服務創建一個友好的界面,並與你交互。您總是調整服務以滿足您的應用程序接口API。這將屏蔽您在服務端的變化,提供您可以用於注入的接口,並允許您插入一些額外的邏輯來處理失敗。

+0

我想我會去#2 - 直到你提到它,我沒有想到將每個app.config的「包含配置文件」與構建腳本相結合,以將共享配置複製到每個配置文件中。我非常感謝#1的答案,但這比我想要解決的問題要多得多,只是頭痛而已。 – Bobson 2011-05-17 14:25:32