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

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

Настройка решения расширения 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. На вкладке Метаданные задайте имя VSIX.

    2. На вкладке Цели установки задайте Visual Studio Ultimate и Premium в качестве целевых объектов.

    3. На вкладке Активы выберите Создать и в диалоговом окне установите:

      Тип = Компонент MEF

      Источник = Проект в текущем решении

      Проект = Проект библиотеки классов

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

Выполнение всех перечисленных ниже задач в проекте библиотеки классов.

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

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

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

    • верный атрибут Export присоединен к классу обработчика, и класс реализует ILinkedWorkItemExtension;

    • параметры всех атрибутов Import и Export являются допустимыми.

Код обработчика рабочего элемента

Ee329485.collapse_all(ru-ru,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(ru-ru,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(ru-ru,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 можно получить через подключение Team Foundation Server.

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

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

См. также

Ссылки

Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

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

Связывание элементов модели и рабочих элементов

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

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

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