Предоставьте переменные NativeActivity конструктору рабочих процессов - PullRequest
1 голос
/ 10 июня 2010

У меня есть NativeActivity, который содержит Activity тело.Целью этого действия является раскрытие ресурса на время действия ребенка как Variable.Проблема, с которой я столкнулся, заключается в том, что Variable нельзя использовать вне действия.Я буду использовать StreamReader в качестве примера ресурса.

ResourceActivity.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();
    }
}

Я не могу просмотреть «Ресурс» или «читатель» в списке переменных в конструкторе рабочих процессов.Я что-то упустил в CacheMetadata?

Ответы [ 2 ]

0 голосов
/ 10 июня 2010

Похоже, что ответ добавлял 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. Она была отложена .

0 голосов
/ 10 июня 2010

Вам нужно определить свое тело как тип ActivityAction вместо Activity, если вы хотите разделить переменную между самой деятельностью и дочерними элементами. См. это сообщение в блоге Мэтта Винклера.

...