방법: 작업 항목 링크 처리기 정의
사용자가 UML 모델 요소와 작업 항목 간의 링크를 만들거나 삭제할 때 이에 응답하는 Visual Studio Integration Extension을 만들 수 있습니다.예를 들어 사용자가 새 작업 항목을 모델 요소에 연결하기로 선택할 경우 코드를 통해 모델의 값에서 작업 항목의 필드를 초기화할 수 있습니다.
UML 확장 솔루션 설치
이렇게 하면 처리기를 개발한 다음 다른 사용자에게 배포할 수 있습니다.다음과 같은 두 개의 Visual Studio 프로젝트를 설치해야 합니다.
링크 처리기의 코드를 포함하는 클래스 라이브러리 프로젝트
명령 설치를 위한 컨테이너 역할을 하는 VSIX 프로젝트.원하는 경우 같은 VSIX에 다른 구성 요소를 포함할 수 있습니다.
Visual Studio 솔루션을 설치하려면
기존 VSIX 솔루션에 추가하거나 새 솔루션을 만들어 클래스 라이브러리 프로젝트를 만듭니다.
에 파일 메뉴를 선택 New, 프로젝트.
아래에서 설치 되어 있는 템플릿, 확장 C# 또는 Visual Basic를 누른 다음 가운데 열에서 클래스 라이브러리.
새 솔루션을 만들지 아니면 이미 열어 놓은 VSIX 솔루션에 구성 요소를 추가할지를 나타내도록 솔루션을 설정합니다.
프로젝트 이름 및 위치를 설정하고 확인을 클릭합니다.
솔루션에 VSIX 프로젝트가 이미 있는 경우가 아니면 새로 만듭니다.
솔루션 탐색기, 솔루션의 바로 가기 메뉴에서 선택 추가에서 새 프로젝트.
아래에서 설치 되어 있는 템플릿, 확장 C# 또는 Visual Basic선택, 확장성.가운데 열에서 선택한 VSIX 프로젝트.
VSIX 프로젝트를 솔루션의 시작 프로젝트로 설정합니다.
- VSIX 프로젝트의 바로 가기 메뉴에서 솔루션 탐색기를 선택 시작 프로젝트로 설정.
source.extension.vsixmanifest의 콘텐츠에서 클래스 라이브러리 프로젝트를 MEF 구성 요소로 추가합니다.
에 있는 메타 데이터 탭에서 VSIX에 이름을 설정 합니다.
에 설치 대상 탭에서 Visual Studio 최고의 프리미엄 대상으로 설정 합니다.
에 자산 탭에서 선택은 New, 대화 상자에서 설정 하 고:
형식 = 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()를 보여 줍니다.
문제 해결: 처리기 메서드가 실행되지 않았으면 다음을 확인하십시오.
클래스 라이브러리 프로젝트가 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