如何从TeamFoundationRequestContext获取当前项目名称

时间:2016-02-04 10:09:34

标签: tfs tfsbuild

我正在为TFS流程编写插件。

每当工作项处于保存过程中时,我都需要从TeamFoundationRequestContext获取项目名称。

通常我可以获取工作项ID,因为记录已经保存。但是,当第一次保存工作项时,我无法获取工作项ID。

我的问题是,当工作项首次保存时,如何从TeamFoundationRequestContext获取项目名称。

2 个答案:

答案 0 :(得分:1)

这是一个捕获工作项更改事件的类,并检查它是否是新创建的工作项。

如果事件是新创建的工作项,则可以使用与该工作项关联的项目名称执行所需操作。

using Microsoft.TeamFoundation.Framework.Server;
using System;
using Microsoft.TeamFoundation.Common;
using Microsoft.TeamFoundation.WorkItemTracking.Server;

namespace TfsProcess.CaptureProjectNameOnNewWorkItem
{
    public class CaptureProjectNameOnNewWorkItem : ISubscriber
    {


        public string Name
        {
            get
            {
                return "CaptureProjectNameOnNewWorkItem";
            }
        }

        public SubscriberPriority Priority
        {
            get
            {
                return SubscriberPriority.Normal;
            }
        }

        public EventNotificationStatus ProcessEvent(
            TeamFoundationRequestContext requestContext,
            NotificationType notificationType,
            object notificationEventArgs,
            out int statusCode,
            out string statusMessage,
            out ExceptionPropertyCollection properties)
        {
            statusCode = 0;
            properties = null;
            statusMessage = String.Empty;

            try
            {
                ProcessNotification(notificationType, notificationEventArgs, requestContext);
            }
            catch (Exception exception)
            {
                TeamFoundationApplicationCore.LogException("Error processing event", exception);
            }
            return EventNotificationStatus.ActionPermitted;

        }

        private static void ProcessNotification(NotificationType notificationType, object notificationEventArgs, TeamFoundationRequestContext requestContext)
        {
            if (notificationType == NotificationType.Notification && notificationEventArgs is Microsoft.TeamFoundation.WorkItemTracking.Server.WorkItemChangedEvent)
            {
                var ev = notificationEventArgs as WorkItemChangedEvent;
                if (ev.ChangeType == ChangeTypes.New)
                {
                    //Do somethin with the project name of the newly created work item
                    // projectName = ev.PortfolioProject;

                }


            }
        }

        public Type[] SubscribedTypes()
        {
            return new Type[1] { typeof(WorkItemChangedEvent) };
        }
    }
}

<强>更新

您可以创建一个实现ITeamFoundationRequestFilter接口的插件,该接口将执行 BEFORE AFTER Team Foundation Server接收并处理请求。这允许您验证工作项并在工作项基于某些逻辑无效时取消创建工作项。

以下是博客的链接,其中包含此实现,如果某个用户正在创建该工作项,则会取消该工作项的创建。

Getting information from a TFS Request

How to implement ITeamFoundationRequestFilter

为了获取工作项ID,您将拦截xml soap响应并解析它以获取工作项值。

使用过滤器插件,您可以过滤任何负责更新,创建和查询工作项的方法。

博客进一步解释和实施。

答案 1 :(得分:0)

WorkItemChangedEvent事件具有PortfolioProject属性,因此您应该能够像这样:

var ev = (WorkItemChangedEvent)notificationEventArgs;
var projectName = ev.PortfolioProject