понедельник, 1 ноября 2010 г. - www.msmirnov.ru

Как поместить свой control на форму Work Item в TFS (Team Foundation Server)

Преамбула.
Вообще говоря, задача, ради которой я решил посмотреть как добавлять свои контролы была такова: довольно часто случается ситуация, когда в текст бага в TFS помещается Stack Trace исключения, которое происходит в работе системы.

Для удобства и ускорения работы хотелось добавить в TFS возможность быстрого перехода от текста стека к коду, создавшему исключение.

Проще говоря, на форме ошибки решили поместить кнопку, при нажатии на которую в Visual Studio будет открываться строка кода, указанная в Stack Trace в Details текущего Work Item.

В этом посте я расскажу о том, как добавлять свои котролы на форму Work Item'а, в следующем - как настроить локацию кода.

Создание контрола для Work Item Type.

Прежде всего в студии создаем новый проект типа Class Library который назовем TFSControlsLibrary.

Затем добавляем в проект новый User Control, назовем его LocateCodeControl.

После создания, помещаем на него кнопку LocateCodeButton, с текстом “Locate code”.

После этого имеем новый контрол такого вида:

clear_ctrl


Подключаем в проект две библиотеки:
1. Microsoft.TeamFoundation.WorkItemTracking.Client (путь: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.WorkItemTracking.Client.dll)
2. Microsoft.TeamFoundation.WorkItemTracking.Controls (путь C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.TeamFoundation.WorkItemTracking.Controls.dll)

Созданный нами контрол LocateCodeControl наследуем от интерфейса IWorkItemControl.

Реализуем интерфейс что называется “по-умолчанию”:


После этого код контрола имеет следующий вид:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.TeamFoundation.WorkItemTracking.Controls;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
 
namespace TFSControlsLibrary
{
public partial class LocateCodeControl : UserControl, IWorkItemControl
{
public LocateCodeControl()
{
InitializeComponent();
}
 
#region IWorkItemControl Members
 
public event EventHandler AfterUpdateDatasource;
public event EventHandler BeforeUpdateDatasource;
 
void IWorkItemControl.Clear() { }
 
void IWorkItemControl.FlushToDatasource() { }
 
void IWorkItemControl.InvalidateDatasource() { }
 
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties {get; set;}
 
bool IWorkItemControl.ReadOnly {get; set;}
 
void IWorkItemControl.SetSite(IServiceProvider serviceProvider) { }
 
public object WorkItemDatasource {get; set;}
 
string IWorkItemControl.WorkItemFieldName {get; set;}
 
#endregion
}
}

Сам контрол на этом готов и если все сделано правильно, то проект должен компилироваться.


Теперь для подключения контрола к TFS в нашем проекте создаем xml-файл с раширением .wicc, который будет использоваться TFS для загрузки библиотеки обработчика контрола. Назовем его LocateCodeControl.wicc


Вот текст файла (как видим, он содержит имя сборки и имя класса контрола.):


<?xml version="1.0" encoding="utf-8" ?>
<CustomControl xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Assembly>TFSControlsLibrary</Assembly>
<FullClassName>TFSControlsLibrary.LocateCodeControl</FullClassName>
</CustomControl>


После всех манипуляций проект будет иметь следующий вид:


sol1


Теперь добавим немного поведения (в качестве теста) для нашей кнопки.

Создадим ей обработчик события Click по которому будем просто отображать Title текущего Work Item’а в MessageBox.

Код обработчика очень простой:

private void LocateCodeButton_Click(object sender, EventArgs e)
{
var ds = WorkItemDatasource as WorkItem;
 
MessageBox.Show(ds.Title);
}


Теперь приступим к тестовому развертыванию нашего контрола.


Для этого необходимо поместить откомпилированную библиотеку контрола и .wcc файл (в нашем случае это файлы TFSControlsLibrary.dll и LocateCodeControl.wicc) в каталог "C:\ProgramData\Microsoft\Team Foundation\Work Item Tracking\Custom Controls\10.0" на каждой машине, на которой будет использоваться данный контрол, так как исполнение кода осуществляется локально, а не на сервере и если этого не сделать, то студия будет писать, что не находит контрол.


После этого можно поместить контрол на форму для какого-либо Work Item Type.

Встроенный в студию Process Editor делать этого не умеет, поэтому придется править xml-файл нашего Work Item'а вручную.

Для этого экспортируем Work Item Type из имеющегося Team Project в локальный xml-файл.

Затем находим этот файл и подключаем в него наш контрол в следующем виде:

<Control Type="LocateCodeControl" />



Затем импортируем наш файл обратно в Team Project.

После этого закрываем Visual Studio и снова открываем ее, иначе она не загрузит наш контрол. Для повторного развертывания наших файлов ее, кстати, также надо будет закрывать, так как она блокирует файлы.

Если все сделано правильно, то при создании бага видим нашу кнопку на форме:


tfs3


При нажатии на кнопку видим наш MessageBox:


tfs4


На этом первичное создание контрола завершено, в следующем посте я расскажу о том, как обеспечить локацию кода по Stack Trace в тексте бага.

P.S.
Другие мои посты на тему TFS:
1. Миграция в TFS (Team Foundation Server)
2. Кто ошибку создает - тот ее и проверяет?
3. Нумерация версий продукта в TFS (Team Foundation Server)
4. Учет трудозатрат и отчетность в TFS (Team Foundation Server)
5. Как создать work item в TFS (Team Foundation Server) из письма в Outlook
6. Как поместить свой control на форму Work Item в TFS (Team Foundation Server)
7. Как настроить номер итерации по умолчанию в TFS (Team Foundation Server)
Мой сайт - www.msmirnov.ru