方法: 作業項目リンク ハンドラーを定義する
ユーザーが UML モデル要素と作業項目の間のリンクを作成または削除したときに応答する Visual Studio Integration Extension を作成できます。 たとえば、ユーザーが新しい作業項目をモデル要素にリンクしたときに、コードによって、その作業項目のフィールドをモデル内の値で初期化することもできます。
UML 拡張機能ソリューションの設定
これにより、ハンドラーを開発した後に他のユーザーに配布できます。 次に示す 2 つの Visual Studio プロジェクトを設定する必要があります。
リンク ハンドラーのコードを含むクラス ライブラリ プロジェクト。
コマンドをインストールするためのコンテナーとして動作する VSIX プロジェクト。 必要に応じて、同じ VSIX に他のコンポーネントを追加できます。
Visual Studio ソリューションを設定するには
クラス ライブラリ プロジェクトを作成し、それを既存の VSIX ソリューションに追加するか、または新規のソリューションを作成します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[インストールされたテンプレート] の [Visual C#] または [Visual Basic] をクリックし、中央の列で、[クラス ライブラリ] をクリックします。
新しいソリューションを作成するか、既に開いている VSIX ソリューションにコンポーネントを追加するかを [ソリューション] に指定します。
プロジェクトの名前と場所を設定し、[OK] をクリックします。
ソリューションに既存の VSIX プロジェクトが存在しない場合は、新しく作成します。
ソリューション エクスプローラーでソリューションを右クリックし、[追加] をポイントして [新しいプロジェクト] をクリックします。
[インストールされたテンプレート] の [Visual C#] または [Visual Basic] を展開し、[機能拡張] をクリックします。 中央の列で、[VSIX プロジェクト] をクリックします。
VSIX プロジェクトをソリューションのスタートアップ プロジェクトとして設定します。
- ソリューション エクスプローラーで、VSIX プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] をクリックします。
source.extension.vsixmanifest の [コンテンツ] で、クラス ライブラリ プロジェクトを MEF コンポーネントとして追加します。
source.extension.vsixmanifest を開きます。
[コンテンツの追加] をクリックします。
[コンテンツ タイプの選択] で、[MEF コンポーネント] を選択します。
[ソースの選択] で、[プロジェクト] をクリックし、クラス ライブラリ プロジェクトの名前を選択します。
[エディションの選択] をクリックし、拡張機能を実行する Visual Studio のエディションを選択します。
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;
}
}
}
リンク ハンドラーのテスト
テストを行う場合は、リンク ハンドラーをデバッグ モードで実行します。
リンク ハンドラーをテストするには
F5 キーを押すか、または [デバッグ] メニューの [デバッグ開始] をクリックします。
Visual Studio の実験用のインスタンスが開始します。
トラブルシューティング: 新規の Visual Studio が開始しない場合は、VSIX プロジェクトがソリューションのスタートアップ プロジェクトとして設定されていることを確認してください。
実験用の Visual Studio で、モデリング プロジェクトを開くか、または生成し、モデリング図を開くか、または生成します。
モデル要素 (UML クラスなど) を生成し、その名前を設定します。
要素を右クリックし、[作業項目の生成] をクリックします。
サブメニューに [Team Foundation Server 接続を開く] が表示される場合は、それをクリックし、ダイアログ ボックスの指示に従ってサーバーに接続します。 次に、モデル要素を再び右クリックし、[作業項目の生成] をクリックします。
サブメニューに作業項目の種類の一覧が表示される場合は、いずれか 1 つをクリックします。
新しい作業項目フォームが開きます。
前のセクションのサンプル コードを使用した場合は、作業項目のタイトルがモデル要素と同じであることを確認します。 これで、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;
参照設定の詳細については、「方法: モデル要素に参照文字列をアタッチする」を参照してください。
参照
処理手順
参照
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore