如何:定义工作项链接处理程序
可以创建响应的 Visual Studio 集成扩展,当用户创建或删除 UML 模型元素与工作项之间的链接。 例如,在中,当用户选择包含一个模型元素链接新工作项,您的代码可以初始化工作项的字段从模型中的值
设置 UML 扩展解决方案
这使您能够开发处理程序会将它们分发给其他用户。 需要设置以下两个 Visual Studio 项目:
包含链接处理程序的代码的类库项目。
VSIX 项目,作为安装的命令容器。 如果需要,可以在同一 VSIX 中包括其他元素。
设置 Visual Studio 解决方案
创建类库项目,并将其添加到现有 VSIX 解决方案或创建新的解决方案。
在 文件 菜单中,选择 新建, 项目。
在 已安装的模板下,展开 Visual C# 或 Visual Basic,然后在中间列中单击 类库。
设置 解决方案 指示是要创建新的解决方案或将元素添加到已经打开的 VSIX 解决方案。
设置项目的名称和位置并单击 " 确定 "。
除非您的解决方案中已有一个,请创建一个 VSIX 项目。
在 解决方案资源管理器,解决方案中的快捷菜单上,选择 add, 新建项目。
在 已安装的模板下,展开 Visual C# 或 Visual Basic,然后选择 扩展性。 在中间列中,选择 VSIX 项目。
将 VSIX 项目设置为解决方案的启动项目。
- 在解决方案资源管理器中,在 VSIX 项目的快捷菜单中选择 设置为启动项目。
在 source.extension.vsixmanifest,在 内容下,将类库项目添加为 MEF 组件。
在 元数据 选项卡上,将一个名称 VSIX 中。
在 安装目标 选项卡上,将 Visual Studio 最终和高质量作为目标。
在 资产 选项卡中,选择 新建,然后在对话框中,设置:
类型 = MEF 组件
源 = 在当前解决方案中的项目
项目 = 您的类库项目
定义工作项链接处理程序
执行下列所有任务。类库项目。
项目引用
添加以下 .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 \。
导入工作项命名空间
在您的 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;
定义链接工作项的事件处理程序
将类文件添加到类库项目,并如下所示设置其内容。 更改命名空间和类名。根据您的喜好。
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;
}
}
}
测试链接处理程序
仅为测试目的,执行您的链接处理程序调试模式。
测试链接处理程序
按 F5,或者在 调试 菜单上,选择 启动调试。
Visual Studio 启动的实验实例。
疑难解答:如果新 Visual Studio 不启动,请确保将 VSIX 项目设置为解决方案的启动项目。
在的实验 Visual Studio,打开或创建一个建模项目,然后打开或创建一个建模图。
创建模型元素 (如 UML 类,并设置其名称。
右击该元素然后单击 创建工作项。
如果子菜单显示 打开 Team Foundation Server 连接,请单击它并遵循对话框连接到服务器。 但是右击模型元素并单击 创建工作项。
如果子菜单显示工作项类型列表中,单击一。
一个新的工作项窗体将打开。
验证工作项的标题与模型元素相同,因此,如果在前面的部分中使用了示例代码。 这说明 OnWorkItemCreated() 已起作用。
完成窗体,保存并关闭该工作项。
验证该工作项现在是否显示为红色。 这说明了示例代码中的 OnWorkItemLinked() 。
疑难解答:如果处理程序方法未运行,请确认:
,在 内容 一个 MEF 组件在 VSIX 项目中, source.extensions.manifest 的列表类库项目列表中。
正确的 Export 特性附加到处理程序类,因此,类实现 ILinkedWorkItemExtension。
所有 Import 和 Export 特性的参数都有效。
有关工作项处理程序代码
侦听新工作项
,当用户选择创建与模型元素时,将链接的新工作项OnWorkItemCreated 调用。 您的代码可以初始化工作项字段。 工作项将呈现给用户,可以更新字段并保存工作项。 模型元素的链接不创建工作项之前,在成功保存了。
public void OnWorkItemCreated(
IEnumerable<IElement> elementsToBeLinked,
IWorkItemDocument workItem)
{
INamedElement namedElement =
elementsToBeLinked.First() as INamedElement;
if (namedElement != null)
workItem.Item.Title = namedElement.Name;
}
侦听链接创建
,在创建链接后,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的其他实现不是必需的。
侦听链接删除
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