2016-02-04 6 views
0

Я пишу плагин для процесса TFS.Как получить текущее название проекта из TeamFoundationRequestContext

Мне нужно получить имя проекта из TeamFoundationRequestContext всякий раз, когда рабочий элемент находится в процессе сохранения.

Обычно я могу получить идентификатор рабочего элемента, потому что запись уже сохранена. Однако, когда рабочий элемент сохраняется в первый раз, у меня нет способа получить идентификатор рабочего элемента.

Мой вопрос: как я могу получить имя проекта из TeamFoundationRequestContext, когда рабочий элемент сохраняет в первый раз.

ответ

0

WorkItemChangedEvent событие имеет PortfolioProject свойство, так что вы должны быть в состоянии получить это так:

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

Фактически, метод ISubscriber запускается, когда iten уже сохранен. Но мне нужно проверить некоторые поля раньше. Итак, нужно работать с RequestContext. –

+0

«WorkItemChangedEvent» срабатывает только после сохранения рабочего элемента, который включает проверку. Это не так. –

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) }; 
     } 
    } 
} 

Update:

Вы можете создать плагин, реализующий интерфейс ITeamFoundationRequestFilter, который запускается на выполнение ПЕРЕД или ПОСЛЕ Team Foundation Server принимает и обрабатывает запросы. Это позволяет проверять рабочие элементы и отменять создание рабочего элемента, если оно недействительно, например, на основе некоторой логики.

Вот ссылка на блог с реализацией этого, которая отменит создание рабочего элемента, если он создается определенным пользователем.

Getting information from a TFS Request

How to implement ITeamFoundationRequestFilter

Для того, чтобы получить работу Item ID вы перехватывать XML-ответ мыло и разобрать его на значение рабочего элемента.

Используя плагин фильтра, вы можете фильтровать любой из методов, ответственных за обновление, создание и запрос рабочих элементов.

В блоге содержится более подробное объяснение и реализация.

+0

На самом деле, метод ISubscriber запускается, когда iten уже сохранен. Но мне нужно проверить некоторые поля раньше. Итак, нужно работать с RequestContext. –

+0

см. Обновленный ответ. – SoftwareCarpenter

+0

Спасибо, я заглянул, но информации о названии проекта нет. Может быть, я каким-то образом поймаю AreaPath из AreaId на всех URL-адресах URL-адреса с именем projectName? –

Смежные вопросы