TFS 2012 - ISubscriber 插件.如何在执行插件时获取项目名称和可能包含触发工作项的查询列表



所以,我有以下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 方法中放置断点即可。

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

有什么建议吗?

WorkItemChangedEvent ev = notificationEventArgs as WorkItemChangedEvent;

可以使用 Tfs.聚合器代码作为类似任务参考的参考

您应该按照以下行解决问题:

  1. 获取项目工作项位于
  2. 获取项目的"共享查询"
  3. 获取每个查询结果的"工作项 ID"
  4. 检查哪一个包含当前更改的"工作项 ID"

所以代码应该是这样的:

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 部署到"插件"文件夹后回收 IIS 应用程序池,以便有时查看更改。

最新更新