2014-10-21 3 views
1

Я создаю пользовательские действия TFS. Кажется, что шаблон по умолчанию, который каждый использует, - это создать переменную в XAML, установить ее с помощью некоторой активности TFS, а затем передать ее в вашу пользовательскую активность TFS. Это кажется очень примитивным, и на практике это очень хлопотно. Если интерфейс к вашей активности TFS изменяется, XAML просто взорвется, теряя все настройки, которые у вас были для активности, для начала.Как получить доступ к различным параметрам определения сборки TFS

Я считаю, что объект CodeActivityContext, который передается пользовательскому действию, имеет все, что мне нужно, но мне не хватает того, как получить доступ к определенным свойствам.

Так, например, у меня есть базовый класс TFS активность, которая в настоящее время выполняет следующие ...

public abstract class ActivityBase : CodeActivity 
{ 
    protected CodeActivityContext _context; 
    protected IBuildAgent _buildAgent; 
    protected IBuildDetail _buildDetail; 
    protected IBuildDefinition _buildDefinition; 
    protected string _buildDirectory; 

    protected override void Execute(CodeActivityContext context) 
    { 
     _context = context; 

     _buildAgent = context.GetExtension<IBuildAgent>(); 
     _buildDetail = context.GetExtension<IBuildDetail>(); 
     _buildDefinition = _buildDetail.BuildDefinition; 
     _buildDirectory = _buildAgent.GetExpandedBuildDirectory(_buildDefinition); 

     Execute(); 
    } 

    protected abstract void Execute(); 
} 

Обратите внимание, я могу получить доступ к BuildDefinition, и я уверен, что это ворота в моем обычае Свойства XAML, заданные пользователем. Однако я не вижу, как получить к ним доступ?

Кроме того, я хотел бы получить доступ к параметрам ProjectsToBuild (который является аргументом в XAML по умолчанию).

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

Спасибо!

ответ

2

код для доступа к «ProjectsToBuild»

protected override void Execute(CodeActivityContext context) 
{ 
    var props = context.DataContext.GetProperties(); 
    var bsProp = props["BuildSettings"]; 
    var buildSettings = (BuildSettings) bsProp.GetValue(context.DataContext); 

    if (buildSettings.HasProjectsToBuild) 
    { 
     context.TrackBuildMessage("Projects to build:", BuildMessageImportance.High); 
     foreach (var project in buildSettings.ProjectsToBuild) 
     { 
      context.TrackBuildMessage(project, BuildMessageImportance.High); 
     } 
    } 
    else 
    { 
     context.TrackBuildMessage("No 'Projects to build' in build definition", BuildMessageImportance.High); 
    } 
} 

Таким образом, вы можете получить доступ (только для чтения) все перечисленные в аргументах вкладке XAML редактор шаблона сборки.

var props = context.DataContext.GetProperties(); 
foreach (System.ComponentModel.PropertyDescriptor prop in props) 
{ 
    context.TrackBuildMessage(string.Format("{0}: {1}", prop.Name, prop.GetValue(context.DataContext)), BuildMessageImportance.High);  
} 

Доступ «ProjectsToBuild» из IBuildDefinition также возможно (что вы пытались сделать), но полезно из других мест, чем строить расширений:

new List<string>() projectsToBuild = new List<string>(); 

IDictionary<string, object> deserializedProcessParameters = WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters); 

if (deserializedProcessParameters.ContainsKey("BuildSettings")) 
{ 
    BuildSettings buildSettings = (BuildSettings)deserializedProcessParameters["BuildSettings"]; 

    if (null != buildSettings) 
     projectsToBuild = buildSettings.ProjectsToBuild; 

} 
-1

Единственный способ получить доступ к своим пользовательским или любым свойствам построения рабочего процесса - передать их. Они не доступны каким-либо другим способом изнутри CodeActivity. Это функция или не работает в Windows Workflow.

Смежные вопросы