다음을 통해 공유


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

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

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;
    

참조에 대한 자세한 내용은 방법: 모델 요소에 참조 문자열 연결을 참조하십시오.

참고 항목

작업

방법: 모델 요소에서 작업 항목으로 연결

참조

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

개념

UML API를 사용한 프로그래밍

기타 리소스

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

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