HOW TO:定義工作項目連結處理常式
您可以建立 Visual Studio Integration Extension,而此擴充功能會在使用者建立或刪除 UML 模型項目和工作項目之間的連結時回應。例如,當使用者選擇將新工作項目連結至模型項目時,您的程式碼可以根據模型中的值初始化此工作項目的欄位。
設定 UML 擴充功能方案
這可讓您開發處理常式,然後將其散發給其他使用者。您必須設定兩個 Visual Studio 專案:
類別庫專案,其中包含連結處理常式的程式碼。
VSIX 專案,做為用於安裝命令的容器。如果您想要,也可以在相同的 VSIX 中加入其他元件。
若要設定 Visual Studio 方案
建立類別庫專案 (不論是透過將其加入至現有的 VSIX 方案,或建立新方案)。
在 [檔案] 功能表上,選擇 [新增, 專案]。
在 [已安裝的範本] 底下,展開 [Visual C#] 或 [Visual Basic],然後在中間的欄位中,按一下 [類別庫]。
設定 [方案],指出您想要建立新的方案,還是想要將元件加入至您已經開啟的 VSIX 方案。
設定專案名稱和位置,然後按一下 [確定]。
建立 VSIX 專案 (若您的方案中已有則不需建立)。
在 [方案總管]中的捷徑功能表中,選取 [新增], [新增專案]。
在 [已安裝的範本] 底下,展開 [Visual C#] 或 [Visual Basic],然後選取 [擴充性]。在中間的欄位中,選擇 [VSIX 專案]。
將 VSIX 專案設定為方案的啟始專案。
- 在 方案總管]裡的 VSIX 專案的捷徑功能表中選取 [設定為啟始專案]。
在 source.extension.vsixmanifest 的 [內容] 底下,加入類別庫專案當做 MEF 元件。
在 [中繼資料] 索引標籤中將名稱設為 VSIX。
在 [安裝目標] 選項上將設定 Visual Studio Ultimate 和 Premium 做為目標。
在 [資產] 索引標籤上,選取 [新增]然後在對話方塊中設定:
類型 = 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或是在Debug選單上選擇 開始除錯。
Visual Studio 的實驗執行個體隨即啟動。
疑難排解:如果新的 Visual Studio 未啟動,請確定已設定 VSIX 專案做為方案的啟始專案。
在實驗性質的 Visual Studio 中,開啟或建立模型專案,然後開啟或建立模型圖表。
建立模型項目 (如 UML 類別),並設定其名稱。
以滑鼠右鍵按一下項目,然後按一下 [建立工作項目]。
如果子功能表顯示 [開啟 Team Foundation Server 連接],請按一下此選項,然後依照對話方塊的指示連接至伺服器。接著,請再次以滑鼠右鍵按一下模型項目,然後按一下 [建立工作項目]。
如果子功能表顯示工作項目類型的清單,請按其中一個工作項目類型。
新的工作項目表單隨即開啟。
如果您使用了上一節的範例程式碼,請確認工作項目的標題與模型項目相同。這表示 OnWorkItemCreated() 有作用。
完成表單,然後在儲存工作項目後加以關閉。
確認工作項目現在顯示為紅色。這表示 OnWorkItemLinked() 位於範例程式碼中。
疑難排解:如果處理常式方法未執行,請確認:
類別庫專案在 VSIX 專案之 source.extensions.manifest 的 [內容] 清單中,已列為 MEF 元件。
已將正確的 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;
如需參考的詳細資訊,請參閱 HOW TO:將參考字串附加至模型項目。
請參閱
參考
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore