1

我有一个NativeActivity包含Activity身体的东西。此活动的目的是在子活动期间将资源公开为Variable. 我遇到的问题是似乎Variable无法在活动之外使用。我将StreamReader用作示例资源。

资源活动.cs:

[Designer(typeof(ResourceActivityDesigner))]
public sealed class ResourceActivity : NativeActivity
{
    [RequiredArgument]
    public InArgument<string> Path { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public Activity Body { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public Variable<StreamReader> Resource { get; set; }

    public ResourceActivity()
    {
        this.Resource = new Variable<StreamReader>
        {
            Default = null,
            Name = "reader"
        };
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        if (this.Path != null) metadata.AddArgument(this.Path);
        if (this.Body != null) metadata.AddChild(this.Body);
        if (this.Resource != null) metadata.AddVariable(this.Resource);
    }

    protected override void Execute(NativeActivityContext context)
    {
        this.Resource.Set(context, new StreamReader(this.Path.Get(context)));
        context.ScheduleActivity(this.Body, new completionCallback(Done), new FaultCallback(Faulted));
    }

    private void Done(NativeActivityContext context, ActivityInstance instance)
    {
        var reader = this.Reader.Get(context);
        if (reader != null) reader.Dispose();
    }

    private void Faulted(NativeActivityFaultContext context, Exception ex, ActivityInstance instance)
    {
        var reader = this.Reader.Get(context);
        if (reader != null) reader.Dispose();
    }
}

我无法在 Workflow Designer 的变量列表中查看“资源”或“阅读器”。我错过了什么CacheMetadata吗?

4

2 回答 2

0

如果要在活动本身和子项之间共享变量,则需要将 Body 定义为类型 ActivityAction 而不是 Activity。请参阅Matt Winkler 的这篇博文。

于 2010-06-10T08:08:56.790 回答
0

看来答案是Collection<Variable>在课堂上添加一个。CacheMetadata是不必要的。

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public Collection<Variable> Variables { get; private set; }

public ResourceActivity()
{
    this.Resource = new Variable<StreamReader> { Default = null, Name = "reader" };
    this.Variables = new Collection<Variable>(new [] { this.Resource });
}

编辑:不,现在发生错误,说明变量被多次定义。如果我没有将资源添加到变量集合中,它就不会出现......

编辑#2:我将此作为 Microsoft Connect 上的错误提交,并被告知这是一个已知错误,但它不是针对 VS 2010 中的修复。它已被推迟。

于 2010-06-10T12:57:48.883 回答