TFS 2012 - ISubscriber插件。如何在执行插件时获取项目名称以及可能包含触发WorkItem的查询列表?

时间:2015-04-20 22:09:38

标签: plugins tfs workitem

所以,我有以下ISubscriber代码:

  
public class Subscriber : ISubscriber
{
    public string Namek
    {
        get { return "Subscriber"; }
    }

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

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

        try
        {
            if(notificationType == NotificationType.Notification && notificationEventArgs is WorkItemChangedEvent)
            {
               var ev = notificationArgs as WorkItemChangedEvent;
               ...........
            }
        }
    }

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

代码有效;安装插件并且TFS识别它之后的意思是,在ProcessEvent方法中放置一个断点。

我的问题是我正在尝试获取项目的名称和属于WorkItem的“共享”查询,其更改触发了此运行到订阅者插件,但我似乎无法找到此类引用(也不是我是否知道它们是否通过此接口提供,因为WorkItemChangedEvent上的信息非常稀疏。)

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

WorkItemChangedEvent ev = notificationEventArgs as WorkItemChangedEvent;

您可以使用Tfs.Aggregator代码作为类似任务reference

的参考

您应该按照这一行来解决您的问题:

  1. 获取项目工作项目
  2. 获取"共享查询"项目
  3. 获取"工作项目ID"每个查询结果
  4. 检查哪一个包含当前已更改的"工作项ID"
  5. 所以代码应该是:

    var tfsCollection = new TfsTeamProjectCollection(new Uri(tfsUri));
    var tfsStore = tfsCollection.GetService<WorkItemStore>();
    var workItemId = ev.CoreFields.IntegerFields[0].NewValue;
    var eventWorkItem = tfsStore.GetWorkItem(workItemId);
    var project = eventWorkItem.Project;
    
    var queryHierarchy = project.QueryHierarchy;
    var queryFolder = queryHierarchy as QueryFolder;
    var queryItem = queryFolder["Shared Queries"];
    queryFolder = queryItem as QueryFolder;
    
    //below is the list including the queries which include work item this event is attached
    var queriesIncludingWorkItem = new List<QueryDefinition>();
    
    if (queryFolder != null)
    {
        foreach (QueryDefinition query in queryFolder)
        {
            var wiCollection = tfsStore.Query(query.QueryText);                            
    
            foreach (WorkItem workItem in wiCollection)
            {
                if (workItem.Id == eventWorkItem.Id)
                {
                    queriesIncludingWorkItem.Add(query);
                    break;
                }
            }
        }
    }
    

    顺便说一下,afaik;在将dll部署到&#34;插件&#34;之后,您需要回收iis应用程序池。文件夹,以便有时看到更改。