65.9K
CodeProject 正在变化。 阅读更多。
Home

创建托管服务工厂

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (3投票s)

2007年8月21日

Ms-PL

2分钟阅读

viewsIcon

18609

在“服务器”结构中托管任意数量的服务,无论它们是远程的还是本地的,并轻松访问该服务器。

引言

我有一个计划。 我想创建一种从任何位置访问多个位置中的服务的方法。 每个位置可以有一个或多个服务,这些服务可能是重复的或不同的。 这是一种非常抽象的思考方式,但我最终提出了一个解决方案。

在使用 Reflector 查看 Team Foundation Server 源代码后,它为我提供了很多提示,我想感谢 Microsoft 的 TFS 团队,我提出了以下解决方案

image

这允许您在“服务器”结构中托管任意数量的服务,无论它们是远程的还是本地的,并轻松访问该服务器。 远程和本地服务可以并排存在于同一服务器中,例如,您可以在 ClientServer 中托管一个 ActiveDirectoryClientService

从服务器级别 (IClientServer),您可以根据其类型或它实现的接口请求服务。 为了实现这一点,IClientService 接口具有一个名为 contracts 的属性,该属性循环遍历客户端服务对象实现的所有接口,并仅提取那些添加了 ClientServiceContractAttribute 的接口。 因此,您需要确保您的所有接口(例如,ITeamServer)都具有该属性,无论它是否也具有 ClientServiceContractAttribute

从工厂级别,您可以再次按类型或按实现请求服务,但此请求是跨服务器的。 如果您有两个添加到工厂的服务器,并且它们都实现了不同的合约,则可以提取您喜欢的任何一个。 如果两个服务器都具有相同的实现,您可以选择是返回第一个还是随机实现。 存在负载平衡解决方案的可能性,但尚未实现。

下面是我的 TFSEventHandlerServer 的图表,其中包含本地和远程服务。 为了便于开发,并且因为它是一件常见的事情,我创建了 WcfClientServiceBase 类,该类提供了许多功能,允许在单个服务客户端类中编写更少的代码。

image

在此示例中,您可以使用相同的代码调用任何 ClientServices

通过调用获取服务器

Dim Server As Servers.TFSEventHandlerServer
Server = Servers.ClientServerFactory.GetServer(Of Servers.TFSEventHandlerServer)_
         (New System.Uri(http://server:6873))

并获取客户端服务,其中 Subscriptions 是本地服务,TeamServers 是远程服务。

Dim Subscriptions As Clients.SubscriptionsService
Subscriptions = Server.GetService(Of Clients.SubscriptionsService)()
Dim TeamServers As Clients.TeamServersService
TeamServers = Server.GetService(Of Clients.TeamServersService)()

正如我希望的那样,您可以看到这使得在企业环境中实施许多功能变得更容易。 您所要做的就是知道哪些服务在哪里可用。 还有可能实施一种查找服务,该服务允许 Factory 在您甚至不知道它们在哪里时为您提供服务!

我希望这可以帮助那些试图找到一种方法来实现相同目标而又不会过于严格的人。 您可以从我的 CodePlex TFS Event Handler 项目下载代码。

© . All rights reserved.