Поделиться через


Практическое руководство. Определение обработчика связей рабочего элемента

Разработчик может создать расширение интеграции Visual Studio, реагирующее на создание или удаление пользователем связи между элементом UML-модели и рабочим элементом. Например, когда пользователь решит связать новый рабочий элемент с элементом модели, код расширения может инициировать поля рабочего элемента значениями, полученными из модели.

Настройка решения расширения UML

Это позволит разработать обработчики и распространить их среди других пользователей. Необходимо настроить два проекта Visual Studio.

  • Проект библиотеки классов, содержащий код обработчика ссылок.

  • Проект VSIX, который выступает контейнером для установки команды. Если необходимо, в тот же проект VSIX можно включить другие компоненты.

Настройка решения Visual Studio

  1. Создайте проект библиотеки классов либо добавив его в существующее решение VSIX, либо создав новое решение.

    1. В меню Файл выберите пункт Создать, а затем команду Проект.

    2. В разделе Установленные шаблоны выберите Visual C# или Visual Basic, затем в центральном столбце щелкните элемент Библиотека классов.

    3. В поле Решение выберите, нужно ли создать новое решение или добавить компонент в уже открытое решение VSIX.

    4. Задайте имя и расположение проекта и нажмите кнопку ОК.

  2. Создайте проект VSIX, если ваше решение еще его не содержит.

    1. В окне Обозреватель решений щелкните правой кнопкой мыши решение, выберите Add, затем щелкните Новый проект.

    2. В разделе Установленные шаблоны разверните узелVisual C# или Visual Basic, а затем выберите пункт Расширение среды. В среднем столбце щелкните Проект VSIX.

  3. Сделайте проект VSIX автоматически загружаемым проектом решения.

    • В обозревателе решений щелкните правой кнопкой мыши проект VSIX, затем щелкните Назначить запускаемым проектом.
  4. Последовательно выберите source.extension.vsixmanifest, Содержимое, затем добавьте проект библиотеки классов в качестве компонента MEF.

    1. Откройте source.extension.vsixmanifest.

    2. Щелкните Добавить содержимое.

    3. В поле Выбор типа содержимого выберите MEF Component.

    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() в коде примера.

    Устранение неполадок. Если методы обработчика не сработали, проверьте следующее:

    • проект библиотеки классов указан в качестве компонента MEF в списке Содержимое в source.extensions.manifest в проекте VSIX;

    • верный атрибут 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 можно получить через подключение Team Foundation Server.

    TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory...;
    RepositoryGuid= tpc.InstanceId;
    

Дополнительные сведения о ссылках см. в разделе Практическое руководство. Присоединение строк ссылок к элементам модели.

См. также

Задачи

Практическое руководство. Связывание элементов модели с рабочими элементами

Ссылки

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

Основные понятия

Программирование с UML API

Другие ресурсы

Практическое руководство. Присоединение строк ссылок к элементам модели

Практическое руководство. Определение и установка расширения моделирования