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

为 TFS 事件处理程序服务创建自己的事件处理程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2007年8月21日

Ms-PL

3分钟阅读

viewsIcon

31440

使用 Team Foundation Server 事件处理程序创建事件处理程序非常容易。您需要继承 AEventHandler 类,该类是安装目录中 RDdotNet.TeamFoundation.dll 的一部分(稍后我会制作一个 SDK)。

引言

使用 Team Foundation Server 事件处理程序 创建事件处理程序非常容易。您需要继承 AEventHandler 类,该类是安装目录中 RDdotNet.TeamFoundation.dll 的一部分(稍后我会制作一个 SDK)。

image

代码

Imports Microsoft.TeamFoundation.Client

Public MustInherit Class AEventHandler(Of TEvent)

 Public MustOverride Sub Run(ByVal EventHandlerItem As EventHandlerItem(Of TEvent), _ 
                             ByVal ServiceHost As ServiceHostItem, _
                             ByVal TeamServer As TeamServerItem, _
                             ByVal e As NotifyEventArgs(Of TEvent))

 Public MustOverride Function IsValid(ByVal EventHandlerItem As EventHandlerItem(Of TEvent), _
                                      ByVal ServiceHost As ServiceHostItem, _
                                      ByVal TeamServer As TeamServerItem, _
                                      ByVal e As NotifyEventArgs(Of TEvent)) As Boolean

End Class

AEventHandler 公开的两种方法具有相同的签名。这是它的含义...

名称 类型 描述
EventHandlerItem EventHandlerItem(Of TEvent) 事件处理程序项包含有关处理程序的信息。这包括配置数据的实例、处理程序本身以及状态属性。TEvent 泛型确保您正在处理的事件的所有内容都是强类型的。
ServiceHost ServiceHostItem 服务的基地址、事件类型、主机配置数据以及指向服务主机对象的链接。
TeamServer TeamServerItem 团队服务器的配置数据以及 Microsoft.TeamFoundation. TeamFoundationServer 对象的实例。
e NotifyEventArgs(Of TEvent) 此对象允许访问所有特定于事件的数据,包括事件对象、事件类型、TFS Identity 对象和 TFS 订阅对象。

让我们看看 TFS 事件处理程序 附带的实现:“AssignedToHandler”。IsValid 方法表示处理程序是否真的会运行

Public Overrides Function IsValid(_
       ByVal EventHandlerItem As EventHandlerItem(Of WorkItemChangedEvent), _
       ByVal ServiceHost As ServiceHostItem, _
       ByVal TeamServer As TeamServerItem, _
       ByVal e As NotifyEventArgs(Of WorkItemChangedEvent)) As Boolean
    If e.Event Is Nothing Then
        Return False
    End If
    Dim assignedName As String = WorkItemEventQuerys.GetAssignedToName(e.Event)
    If String.IsNullOrEmpty(assignedName) Then
        Return False
    Else
        Return Not assignedName = WorkItemEventQuerys.GetChangedByName(e.Event)
    End If
End Function

此方法最初检查事件是否存在,然后使用工作项事件查询从事件中查询分配的名称,该查询包括

Return eventData.CoreFields.StringFields.Find(New _
       Predicate(Of StringField)(AddressOf FindAssignedTo)).NewValue

所有这些只是搜索与核心工作项位关联的字符串字段以找到“System.AssignedTo”值。您可以手动执行此操作,但我在这里有很多查询,您可以添加任意数量的查询。

逻辑:如果事件存在并且分配的名称不为空,则检查分配的名称是否不是更改的名称。

因此,用英语来说,撇开所有废话:用户是否将工作项分配给自己?如果不是,就给他们发送一封电子邮件!

正如他们所说,其余的只是逻辑。“Run”方法调用“IsValid”,然后发送电子邮件(如果它实际上有效),这根本不是什么高深的科学。

希望有了这些知识,您将能够制作许多许多事件处理程序!

更新

对于 TFS 事件处理程序 的延迟 CTP 1,我更改了很多逻辑,但仍然存在相同的 IsValidRun 方法。但是,参数略有不同。我已经考虑了安全性,您将需要使用您自己的用户名和密码建立自己与 TFS 服务器的连接。我已将此更改为保护应用程序的安全性,因为我希望开发人员能够上传事件处理程序程序集和 WF 工作流程,而无需访问服务器。我还更改了捕获事件的服务与运行处理程序的不是同一个服务。这允许我使用 MSMQ 在这些服务之间发送事件,从而为服务提供一些急需的冗余。

© . All rights reserved.