Dependency injection 当决定使用哪个依赖项需要使用依赖项时,如何注入依赖项

Dependency injection 当决定使用哪个依赖项需要使用依赖项时,如何注入依赖项,dependency-injection,Dependency Injection,我有一个典型的引导问题。我正在尝试将用于版本控制的TFS客户端库注入到我的应用程序中,但我需要在不同的情况下加载不同版本的客户端库:TFS 2013客户端库无法连接到TFS 2005或TFS 2008服务器,因此,在连接到这些较旧版本的TFS时,我需要加载较早版本的客户端库。我发现,通过从IBuildServer服务请求BuildServerVersion属性,我可以可靠地确定连接到的TFS版本 通常我会使用抽象工厂模式来解决这个问题,并使用IoC容器来加载适当的工厂实现;然而,通常情况下,决定

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

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


<> P> >我可以考虑什么方法来解决这个问题?

< P>你能在一个AppDeavy中加载一个TFS LIB版本吗?然后您可以进行调用,卸载AppDomain,这将卸载LIB,并重新加载正确的版本。

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

由于听起来可以同时加载多个版本的客户端库,因此最简单的解决方案可能是从。定义的唯一目的是确定BuildServerVersion

可能是这样的

public interface IBuildServerVersionQuery
{
    Version GetBuildServerVersion();
}
然后,您可以围绕其中一个客户端库编写一个脚本,并使用它来获取BuildServerVersion

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

您还可以使用或(我的首选)选择适当的客户端库


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

因为听起来可以同时加载多个版本的客户端库,所以最简单的解决方案可能是从。定义的唯一目的是确定BuildServerVersion

可能是这样的

public interface IBuildServerVersionQuery
{
    Version GetBuildServerVersion();
}
然后,您可以围绕其中一个客户端库编写一个脚本,并使用它来获取BuildServerVersion

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

您还可以使用或(我的首选)选择适当的客户端库


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

是否可以在不需要TFS库的情况下调用BuildServerVersion?如果是,请围绕这个问题创建一个小包装。是的,但是:“Microsoft不提供直接与web服务对话的支持。这些接口将来可能会发生巨大的变化”(引用自)。我认为,您所处的整个情况是一个大的接口在未来会发生巨大的变化。这就是为什么你必须对不同的服务器使用不同的客户机…不同版本的客户机库是否可以并排存在于同一AppDomain中?@MarkSeemann是的,我认为是这样:客户机库有不同的主要版本。这可能也会有所帮助。是否可以在不需要TFS库的情况下调用BuildServerVersion?如果是,请围绕这个问题创建一个小包装。是的,但是:“Microsoft不提供直接与web服务对话的支持。这些接口将来可能会发生巨大的变化”(引用自)。我认为,您所处的整个情况是一个大的接口在未来会发生巨大的变化。这就是为什么你必须对不同的服务器使用不同的客户机…不同版本的客户机库是否可以并排存在于同一AppDomain中?@MarkSeemann是的,我认为是这样:客户机库有不同的主要版本。这可能也有帮助。