我正在创建自定义TFS活动。似乎每个人使用的默认模式是在XAML中创建变量,使用某些TFS活动设置它,然后将其传递到您的自定义TFS活动中。这似乎非常原始,在实践中它非常麻烦。如果TFS活动的界面发生变化,那么XAML就会失去您开始活动的所有设置。
我认为传递给自定义活动的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中的参数)。
我还需要其他一些东西,但如果我能掌握这些第一件事,我应该能够弄清楚其余的事情。
谢谢!
答案 0 :(得分: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编辑器的Arguments选项卡中列出的所有内容。
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);
}
也可以从IBuildDefinition访问“ProjectsToBuild”(您尝试这样做),但是除了构建扩展之外的其他地方也很有用:
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 :(得分:-1)
访问自定义或任何构建工作流属性的唯一方法是将它们传入。它们不能以任何其他方式从CodeActivity中获取。这是Windows Workflow的功能与否。