방법: 작업 항목 링크 처리기 정의

사용자가 UML 모델 요소와 작업 항목 간의 링크를 만들거나 삭제할 때 이에 응답하는 Visual Studio Integration Extension을 만들 수 있습니다.예를 들어 사용자가 새 작업 항목을 모델 요소에 연결하기로 선택할 경우 코드를 통해 모델의 값에서 작업 항목의 필드를 초기화할 수 있습니다.

UML 확장 솔루션 설치

이렇게 하면 처리기를 개발한 다음 다른 사용자에게 배포할 수 있습니다.다음과 같은 두 개의 Visual Studio 프로젝트를 설치해야 합니다.

  • 링크 처리기의 코드를 포함하는 클래스 라이브러리 프로젝트

  • 명령 설치를 위한 컨테이너 역할을 하는 VSIX 프로젝트.원하는 경우 같은 VSIX에 다른 구성 요소를 포함할 수 있습니다.

Visual Studio 솔루션을 설치하려면

  1. 기존 VSIX 솔루션에 추가하거나 새 솔루션을 만들어 클래스 라이브러리 프로젝트를 만듭니다.

    1. 파일 메뉴를 선택 New, 프로젝트.

    2. 아래에서 설치 되어 있는 템플릿, 확장 C# 또는 Visual Basic를 누른 다음 가운데 열에서 클래스 라이브러리.

    3. 새 솔루션을 만들지 아니면 이미 열어 놓은 VSIX 솔루션에 구성 요소를 추가할지를 나타내도록 솔루션을 설정합니다.

    4. 프로젝트 이름 및 위치를 설정하고 확인을 클릭합니다.

  2. 솔루션에 VSIX 프로젝트가 이미 있는 경우가 아니면 새로 만듭니다.

    1. 솔루션 탐색기, 솔루션의 바로 가기 메뉴에서 선택 추가에서 새 프로젝트.

    2. 아래에서 설치 되어 있는 템플릿, 확장 C# 또는 Visual Basic선택, 확장성.가운데 열에서 선택한 VSIX 프로젝트.

  3. VSIX 프로젝트를 솔루션의 시작 프로젝트로 설정합니다.

    • VSIX 프로젝트의 바로 가기 메뉴에서 솔루션 탐색기를 선택 시작 프로젝트로 설정.
  4. source.extension.vsixmanifest콘텐츠에서 클래스 라이브러리 프로젝트를 MEF 구성 요소로 추가합니다.

    1. 에 있는 메타 데이터 탭에서 VSIX에 이름을 설정 합니다.

    2. 설치 대상 탭에서 Visual Studio 최고의 프리미엄 대상으로 설정 합니다.

    3. 자산 탭에서 선택은 New, 대화 상자에서 설정 하 고:

      형식 = MEF 구성 요소

      소스 = 현재 솔루션의 프로젝트에

      프로젝트 = 클래스 라이브러리 프로젝트

작업 항목 링크 처리기 정의

클래스 라이브러리 프로젝트에서 다음 작업을 모두 수행합니다.

Ee329485.collapse_all(ko-kr,VS.110).gif프로젝트 참조

프로젝트 참조에 다음 .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\에서 참조를 찾습니다.

Ee329485.collapse_all(ko-kr,VS.110).gif작업 항목 네임스페이스 가져오기

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;

Ee329485.collapse_all(ko-kr,VS.110).gif연결된 작업 항목 이벤트 처리기 정의

클래스 라이브러리 프로젝트에 클래스 파일을 추가하고 이 파일의 내용을 다음과 같이 설정합니다.네임스페이스 및 클래스 이름을 원하는 대로 변경하십시오.

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 특성의 모든 매개 변수가 올바른지 확인합니다.

작업 항목 처리기 코드

Ee329485.collapse_all(ko-kr,VS.110).gif새 작업 항목 수신 대기

사용자가 모델 요소에 연결할 새 작업 항목을 만들기로 선택하면 OnWorkItemCreated가 호출됩니다.코드에서는 작업 항목 필드를 초기화할 수 있습니다.그런 다음 해당 작업 항목이 사용자에게 표시되며 사용자는 필드를 업데이트하고 작업 항목을 저장할 수 있습니다.작업 항목이 저장되기 전에는 모델 요소에 대한 링크가 만들어지지 않습니다.

  public void OnWorkItemCreated(
      IEnumerable<IElement> elementsToBeLinked,
      IWorkItemDocument workItem)
  {
    INamedElement namedElement = 
           elementsToBeLinked.First() as INamedElement;
    if (namedElement != null)
        workItem.Item.Title = namedElement.Name;
  }

Ee329485.collapse_all(ko-kr,VS.110).gif링크 만들기 수신 대기

링크가 만들어진 직후에는 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의 다른 구현에는 이러한 추가 작업이 필요하지 않습니다.

Ee329485.collapse_all(ko-kr,VS.110).gif링크 제거 수신 대기

각 작업 항목 링크가 삭제되기 직전에는 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

개념

모델 요소 및 작업 항목 연결

방법: 모델 요소에 참조 문자열 연결

방법: 모델링 확장 정의 및 설치

UML API를 사용한 프로그래밍