我有一个经典的引导问题。我试图将版本控制的TFS客户端库注入我的应用程序,但我需要在不同的情况下加载不同版本的客户端库:TFS 2013客户端库无法连接到TFS 2005或TFS 2008服务器,所以我需要在连接到这些旧版本的TFS时加载早期版本的客户端库。我发现通过从BuildServerVersion
服务请求IBuildServer
属性,我可以可靠地确定我要连接的TFS的版本。
通常我会使用抽象工厂模式解决这个问题,并使用IoC容器加载适当的工厂实现;但是,通常决定完全是申请的责任。在我的情况下,决定是基于TFS服务器的响应,而且,至关重要的是,我必须加载 版本的TFS客户端库,以便首先从TFS服务器请求该信息。
我可以考虑采取哪些方法来解决这个问题?
答案 0 :(得分:3)
由于听起来可能同时加载了多个版本的客户端库,因此最简单的解决方案可能是从Interface Segregation Principle获取提示。定义Role Interface,其唯一目的是找出BuildServerVersion。
可能类似
public interface IBuildServerVersionQuery
{
Version GetBuildServerVersion();
}
然后,您可以在其中一个客户端库周围编写Adapter并使用它来获取BuildServerVersion。
然后,当您拥有BuildServerVersion时,您可以使用它来实现返回真实客户端库的抽象工厂。
您还可以使用these selection mechanisms之一,例如Metadata,Role Interfaces或(我的首选)Partial Type Name来选择相应的客户端库。
除非GetBuildServerVersion()
方法返回与实现IBuildServerVersionQuery
接口本身的客户端库相对应的版本,否则这意味着您将(现在)冗余客户端库加载到AppDomain中,但是真的有问题吗?
答案 1 :(得分:1)
您可以在AppDomain中加载TFS库的版本吗?然后你可以进行调用,卸载AppDomiain,它将卸载libs,然后重新加载正确的版本。