共用方式為


HOW TO:定義工作項目連結處理常式

您可以建立 Visual Studio Integration Extension,而此擴充功能會在使用者建立或刪除 UML 模型項目和工作項目之間的連結時回應。 例如,當使用者選擇將新工作項目連結至模型項目時,您的程式碼可以根據模型中的值初始化此工作項目的欄位。

設定 UML 擴充功能方案

這可讓您開發處理常式,然後將其散發給其他使用者。 您必須設定兩個 Visual Studio 專案:

  • 類別庫專案,其中包含連結處理常式的程式碼。

  • VSIX 專案,做為用於安裝命令的容器。 如果您想要,也可以在相同的 VSIX 中加入其他元件。

若要設定 Visual Studio 方案

  1. 建立類別庫專案 (不論是透過將其加入至現有的 VSIX 方案,或建立新方案)。

    1. 在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。

    2. 在 [已安裝的範本] 底下,按一下 [Visual C#] 或 [Visual Basic],然後在中間的欄位中,按一下 [類別庫]。

    3. 設定 [方案],指出您想要建立新的方案,還是想要將元件加入至您已經開啟的 VSIX 方案。

    4. 設定專案名稱和位置,然後按一下 [確定]。

  2. 建立 VSIX 專案 (若您的方案中已有則不需建立)。

    1. 在 [方案總管] 中,以滑鼠右鍵按一下方案、指向 [加入],再按一下 [新增專案]。

    2. 在 [已安裝的範本] 底下,展開 [Visual C#] 或 [Visual Basic],然後按一下 [擴充性]。 在中間的欄位中,按一下 [VSIX 專案]。

  3. 將 VSIX 專案設定為方案的啟始專案。

    • 在 [方案總管] 中,以滑鼠右鍵按一下 VSIX 專案,然後按一下 [設定為啟始專案]。
  4. source.extension.vsixmanifest 的 [內容] 底下,加入類別庫專案當做 MEF 元件。

    1. 開啟 source.extension.vsixmanifest

    2. 按一下 [加入內容]。

    3. 在 [選取內容類型] 中,選取 [MEF 元件]。

    4. 在 [選取來源] 中,按一下 [專案],然後選取類別庫專案的名稱。

  5. 按一下 [選取版本],然後選取您想要用來執行擴充功能的 Visual Studio 版本。

  6. 設定 VSIX 的名稱和描述性欄位。 儲存檔案。

定義工作項目連結處理常式

執行位於類別庫專案中的所有下列工作。

專案參考

將下列 .NET 組件加入至您的專案參考:

Microsoft.TeamFoundation.WorkItemTracking.Client.dll

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

Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml

Microsoft.VisualStudio.Uml.Interfaces

System.ComponentModel.Composition

System.Drawing - 由範例程式碼使用

如果您在 [加入參考] 對話方塊的 [.Net] 索引標籤下找不到其中一個參考,請使用 [瀏覽] 索引標籤在 \Program Files\Microsoft Visual Studio 10.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;
    }
  }
}

測試連結處理常式

為進行測試,請在偵錯模式中執行您的連結處理常式。

若要測試連結處理常式

  1. 按下 F5,或在 [偵錯] 功能表上,按一下 [開始偵錯]。

    Visual Studio 的實驗執行個體隨即啟動。

    疑難排解:如果新的 Visual Studio 未啟動,請確定已設定 VSIX 專案做為方案的啟始專案。

  2. 在實驗性質的 Visual Studio 中,開啟或建立模型專案,然後開啟或建立模型圖表。

  3. 建立模型項目 (如 UML 類別),並設定其名稱。

  4. 以滑鼠右鍵按一下項目,然後按一下 [建立工作項目]。

    • 如果子功能表顯示 [開啟 Team Foundation Server 連接],請按一下此選項,然後依照對話方塊的指示連接至伺服器。 接著,請再次以滑鼠右鍵按一下模型項目,然後按一下 [建立工作項目]。

    • 如果子功能表顯示工作項目類型的清單,請按其中一個工作項目類型。

      新的工作項目表單隨即開啟。

  5. 如果您使用了上一節的範例程式碼,請確認工作項目的標題與模型項目相同。 這表示 OnWorkItemCreated() 有作用。

  6. 完成表單,然後在儲存工作項目後加以關閉。

  7. 確認工作項目現在顯示為紅色。 這表示 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:將參考字串附加至模型項目

請參閱

工作

HOW TO:從模型項目連結至工作項目

參考

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

其他資源

HOW TO:將參考字串附加至模型項目

HOW TO:定義與安裝模型擴充功能

使用 UML API 進行程式設計