在决定使用哪个依赖项时如何注入依赖项需要使用依赖项

时间:2014-01-29 15:19:42

标签: dependency-injection

我有一个经典的引导问题。我试图将版本控制的TFS客户端库注入我的应用程序,但我需要在不同的情况下加载不同版本的客户端库:TFS 2013客户端库无法连接到TFS 2005或TFS 2008服务器,所以我需要在连接到这些旧版本的TFS时加载早期版本的客户端库。我发现通过从BuildServerVersion服务请求IBuildServer属性,我可以可靠地确定我要连接的TFS的版本。

通常我会使用抽象工厂模式解决这个问题,并使用IoC容器加载适当的工厂实现;但是,通常决定完全是申请的责任。在我的情况下,决定是基于TFS服务器的响应,而且,至关重要的是,我必须加载 版本的TFS客户端库,以便首先从TFS服务器请求该信息。

我可以考虑采取哪些方法来解决这个问题?

2 个答案:

答案 0 :(得分:3)

由于听起来可能同时加载了多个版本的客户端库,因此最简单的解决方案可能是从Interface Segregation Principle获取提示。定义Role Interface,其唯一目的是找出BuildServerVersion。

可能类似

public interface IBuildServerVersionQuery
{
    Version GetBuildServerVersion();
}

然后,您可以在其中一个客户端库周围编写Adapter并使用它来获取BuildServerVersion。

然后,当您拥有BuildServerVersion时,您可以使用它来实现返回真实客户端库的抽象工厂。

您还可以使用these selection mechanisms之一,例如MetadataRole Interfaces或(我的首选)Partial Type Name来选择相应的客户端库。

除非GetBuildServerVersion()方法返回与实现IBuildServerVersionQuery接口本身的客户端库相对应的版本,否则这意味着您将(现在)冗余客户端库加载到AppDomain中,但是真的有问题吗?

答案 1 :(得分:1)

您可以在AppDomain中加载TFS库的版本吗?然后你可以进行调用,卸载AppDomiain,它将卸载libs,然后重新加载正确的版本。