2014-01-29 167 views
1

我有一個經典的自引導問題。我試圖將用於版本控制的TFS客戶端庫注入到我的應用程序中,但我需要在不同情況下加載不同版本的客戶端庫:TFS 2013客戶端庫無法連接到TFS 2005或TFS 2008服務器,因此我需要在連接到這些舊版本的TFS時加載較早版本的客戶端庫。我發現我可以通過請求IBuildServer服務的BuildServerVersion屬性來可靠地確定我正在連接的TFS的版本。如何在決定使用哪個依賴項時注入依賴關係需要使用依賴關係

通常我會使用抽象工廠模式解決這個問題,並使用IoC容器來加載相應的工廠實現;然而,通常這個決定完全是應用程序的責任。在我的情況下,這個決定是基於TFS服務器的響應,而且最重要的是,我必須加載TFS客戶端庫的版本,以便首先從TFS服務器請求這些信息。

我可以考慮哪些方法來解決這個問題?

+2

可以調用BuildServerVersion而不需要TFS庫嗎?如果是的話,圍繞這一個調用創建一個小包裝 –

+0

是的,但是:「Microsoft不提供直接與Web服務對話的支持,這些接口在將來可能會發生劇烈變化」(引用[來自MS員工的這個答案] (http://stackoverflow.com/a/9134693/5296))。 – alastairs

+0

我認爲你所處的整體情況是一個大*接口在未來大幅度變化的情況。這就是爲什麼你必須針對不同的服務器使用不同的客戶端... –

回答

1

你可以加載AppDomain中的TFS庫的一個版本嗎?然後你可以進行調用,卸載AppDomiain,它將卸載庫,並重新加載正確的版本。

3

由於聽起來可能同時加載多個版本的客戶端庫,因此最簡單的解決方案可能是從Interface Segregation Principle中獲取提示。定義一個Role Interface,唯一目的是計算BuildServerVersion。

這可能是這樣的

public interface IBuildServerVersionQuery 
{ 
    Version GetBuildServerVersion(); 
} 

然後,您可以編寫客戶端庫圍繞Adapter,並用它來獲得BuildServerVersion。

然後,當您擁有BuildServerVersion時,可以使用它來實現一個返回真實客戶端庫的Abstract Factory。

你也可以使用一個these selection mechanisms,如MetadataRole Interfaces,或(我的首選)Partial Type Name,來選擇合適的客戶端庫。

除非GetBuildServerVersion()方法返回與實現IBuildServerVersionQuery接口本身的客戶端庫相對應的版本,這意味着您將有一個(現在)冗餘客戶端庫加載到AppDomain中,但這確實是一個問題嗎?