Domanda

Ho un NativeActivity che contiene un corpo Activity. Lo scopo di questa attività è quello di esporre una risorsa per tutta la durata dell'attività bambino come Variable. Il problema che ho incontrato è sembra il Variable non può essere utilizzato al di fuori l'attività. Userò StreamReader come una risorsa esempio.

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

Non riesco a visualizzare "risorse" o "lettore" nella lista delle variabili in Workflow Designer. Mi sto perdendo qualcosa in CacheMetadata?

È stato utile?

Soluzione 2

Sembra che la risposta è stata l'aggiunta di un Collection<Variable> alla classe. CacheMetadata era necessario.

[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 });
}

Modifica No, ora si verifica un errore in cui si afferma la variabile è definita più volte. Se lascio fuori aggiungendo la risorsa alla collezione variabili semplicemente non si presenta ...

Modifica # 2: ho presentato questo come un bug su Microsoft Connect ed è stato detto che questo è un bug noto, ma non è mirato per una correzione in VS 2010. E 'stata rinviata.

Altri suggerimenti

È necessario definire il tuo corpo come tipo ActivityAction invece di attività se si desidera condividere una variabile tra l'attività in sé ei figli. Vedere questo post del blog da Matt Winkler.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top