如何:定义工作项链接处理程序

可以创建响应的 Visual Studio 集成扩展,当用户创建或删除 UML 模型元素与工作项之间的链接。 例如,在中,当用户选择包含一个模型元素链接新工作项,您的代码可以初始化工作项的字段从模型中的值

设置 UML 扩展解决方案

这使您能够开发处理程序会将它们分发给其他用户。 需要设置以下两个 Visual Studio 项目:

  • 包含链接处理程序的代码的类库项目。

  • VSIX 项目,作为安装的命令容器。 如果需要,可以在同一 VSIX 中包括其他元素。

设置 Visual Studio 解决方案

  1. 创建类库项目,并将其添加到现有 VSIX 解决方案或创建新的解决方案。

    1. 文件 菜单中,选择 新建项目

    2. 已安装的模板下,展开 Visual C#Visual Basic,然后在中间列中单击 类库

    3. 设置 解决方案 指示是要创建新的解决方案或将元素添加到已经打开的 VSIX 解决方案。

    4. 设置项目的名称和位置并单击 " 确定 "。

  2. 除非您的解决方案中已有一个,请创建一个 VSIX 项目。

    1. 解决方案资源管理器,解决方案中的快捷菜单上,选择 add新建项目

    2. 已安装的模板下,展开 Visual C#Visual Basic,然后选择 扩展性。 在中间列中,选择 VSIX 项目

  3. 将 VSIX 项目设置为解决方案的启动项目。

    • 在解决方案资源管理器中,在 VSIX 项目的快捷菜单中选择 设置为启动项目
  4. source.extension.vsixmanifest,在 内容下,将类库项目添加为 MEF 组件。

    1. 元数据 选项卡上,将一个名称 VSIX 中。

    2. 安装目标 选项卡上,将 Visual Studio 最终和高质量作为目标。

    3. 资产 选项卡中,选择 新建,然后在对话框中,设置:

      类型 = MEF 组件

      = 在当前解决方案中的项目

      项目 = 您的类库项目

定义工作项链接处理程序

执行下列所有任务。类库项目。

Ee329485.collapse_all(zh-cn,VS.110).gif项目引用

添加以下 .NET 程序集添加到您的项目引用:

Microsoft.TeamFoundation.WorkItemTracking.Client.dll

Microsoft.VisualStudio.TeamFoundation.WorkItemTracking.dll Microsoft.VisualStudio.Modeling.Sdk.11.0

Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml

Microsoft.VisualStudio.Uml.Interfaces

System.ComponentModel.Composition

代码示例 - 使用的System.Drawing

如果找不到其中一个引用在 添加引用 对话框的 . net 选项下,请使用 " 浏览 " 选项卡在 \ program files \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ PrivateAssemblies \。

Ee329485.collapse_all(zh-cn,VS.110).gif导入工作项命名空间

在您的 Visual Studio 项目 引用,添加对以下程序集的引用: 

  • Microsoft.TeamFoundation.WorkItemTracking.Client.dll

  • Microsoft.VisualStudio.TeamFoundation.WorkItemTracking.dll

在程序代码中,导入以下命名空间:

using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.TeamFoundation.WorkItemTracking;
using System.Linq;

Ee329485.collapse_all(zh-cn,VS.110).gif定义链接工作项的事件处理程序

将类文件添加到类库项目,并如下所示设置其内容。 更改命名空间和类名。根据您的喜好。

using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.TeamFoundation.WorkItemTracking;
using System.Linq;


namespace WorkItems
{
  [Export(typeof(ILinkedWorkItemExtension))]
  public class MyWorkItemExtension : ILinkedWorkItemExtension
  {
    // Called before a new work item is edited by the user.
    // Use this to initialize work item fields from the model element.
    public void OnWorkItemCreated(System.Collections.Generic.IEnumerable<IElement> elementsToBeLinked, IWorkItemDocument workItemDocument)
    {
      INamedElement namedElement =
            elementsToBeLinked.First() as INamedElement;
      if (namedElement != null)
        workItemDocument.Item.Title = namedElement.Name;

    }

    // Called when any work item is linked to a model element.
    public void OnWorkItemLinked(System.Collections.Generic.IEnumerable<IElement> elements, string serverUri, int workItemId)
    {
      foreach (IElement element in elements)
        foreach (IShape shape in element.Shapes())
          shape.Color = System.Drawing.Color.Red;
    }

    // Called when a work item is unlinked from a model element.
    public void OnWorkItemRemoved(IElement element, string serverUri, int workItemId)
    {
      foreach (IShape shape in element.Shapes())
        shape.Color = System.Drawing.Color.White;
    }
  }
}

测试链接处理程序

仅为测试目的,执行您的链接处理程序调试模式。

测试链接处理程序

  1. F5,或者在 调试 菜单上,选择 启动调试

    Visual Studio 启动的实验实例。

    疑难解答:如果新 Visual Studio 不启动,请确保将 VSIX 项目设置为解决方案的启动项目。

  2. 在的实验 Visual Studio,打开或创建一个建模项目,然后打开或创建一个建模图。

  3. 创建模型元素 (如 UML 类,并设置其名称。

  4. 右击该元素然后单击 创建工作项

    • 如果子菜单显示 打开 Team Foundation Server 连接,请单击它并遵循对话框连接到服务器。 但是右击模型元素并单击 创建工作项

    • 如果子菜单显示工作项类型列表中,单击一。

      一个新的工作项窗体将打开。

  5. 验证工作项的标题与模型元素相同,因此,如果在前面的部分中使用了示例代码。 这说明 OnWorkItemCreated() 已起作用。

  6. 完成窗体,保存并关闭该工作项。

  7. 验证该工作项现在是否显示为红色。 这说明了示例代码中的 OnWorkItemLinked() 。

    疑难解答:如果处理程序方法未运行,请确认:

    • ,在 内容 一个 MEF 组件在 VSIX 项目中, source.extensions.manifest 的列表类库项目列表中。

    • 正确的 Export 特性附加到处理程序类,因此,类实现 ILinkedWorkItemExtension。

    • 所有 Import 和 Export 特性的参数都有效。

有关工作项处理程序代码

Ee329485.collapse_all(zh-cn,VS.110).gif侦听新工作项

,当用户选择创建与模型元素时,将链接的新工作项OnWorkItemCreated 调用。 您的代码可以初始化工作项字段。 工作项将呈现给用户,可以更新字段并保存工作项。 模型元素的链接不创建工作项之前,在成功保存了。

  public void OnWorkItemCreated(
      IEnumerable<IElement> elementsToBeLinked,
      IWorkItemDocument workItem)
  {
    INamedElement namedElement = 
           elementsToBeLinked.First() as INamedElement;
    if (namedElement != null)
        workItem.Item.Title = namedElement.Name;
  }

Ee329485.collapse_all(zh-cn,VS.110).gif侦听链接创建

,在创建链接后,OnWorkItemLinked 调用。 它调用该链接是否为新工作项或现有项目。 它为每个工作项一次。

public void OnWorkItemLinked
        (IEnumerable<IElement> elements, 
         string serverUri, // TFS server
         int workItemId)
{
  foreach (IElement element in elements)
    foreach (IShape shape in element.Shapes())
         shape.Color = System.Drawing.Color.Red;
}

备注

若要使此示例正常工作,必须添加对的项目引用 System.Drawing.dll,并导入命名空间 Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation。但是,并不需要这些添加 OnWorkItemLinked的其他实现不是必需的。

Ee329485.collapse_all(zh-cn,VS.110).gif侦听链接删除

OnWorkItemRemoved 在删除的每个工作项链接之前调用。 如果一个模型删除组件,则将移除所有其链接。

public void OnWorkItemRemoved
         (IElement element, string serverUri, int workItemId)
{...}

更新工作项

使用 Team Foundation 命名空间,可以操作工作项。

若要使用以下示例,请将这些 .NET 程序集添加到项目的引用:

  • Microsoft.TeamFoundation.Client.dll

  • Microsoft.TeamFoundation.WorkItemTracking.Client.dll

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
...
public void OnWorkItemLinked
        (IEnumerable<IElement> elements, 
         string serverUri, // TFS server
         int workItemId)
{
  TfsTeamProjectCollection tfs =
        TfsTeamProjectCollectionFactory
            .GetTeamProjectCollection(new Uri(serverUri));
  WorkItemStore workItemStore = new WorkItemStore(tfs);
  WorkItem item = workItemStore.GetWorkItem(workItemId);
  item.Open();
  item.Title = "something";
  item.Save();
} 

访问工作项引用链接

可以访问链接如下所示:

//Get:
string linkString = element.GetReference(ReferenceConstants.WorkItem);
// Set:
element.AddReference(ReferenceConstants.WorkItem, linkString, true);

linkString 格式为:

string.Format(@"%{0}\{1}#{1}${2}", tfServer, projectCollection, RepositoryGuid, workItem.Id);

其中:

  • 您的服务器的 URI 为:

    http://tfServer:8080/tfs/projectCollection

    用例非常重要的。 projectCollection。

  • RepositoryGuid 可以通过 TFS 连接获取:

    TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory...;
    RepositoryGuid= tpc.InstanceId;
    

有关引用的更多信息,请参见 如何:将引用字符串附加到模型元素

请参见

参考

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

概念

链接模型元素和工作项

如何:将引用字符串附加到模型元素

如何:定义和安装建模扩展

使用 UML API 编程