2014-01-29 170 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中,但这确实是一个问题吗?