Domanda

Sto cercando di implementare un'attività simile a InvokeWorkflow, che potrebbe caricare dinamicamente un file XOML, un'istanza di un albero di attività da esso, e usarlo come il suo unico figlio.

Questo potrebbe essere simile a InvokeWorkflow eccetto che le attività che vengono caricate dinamicamente sono sia allineata nel flusso di lavoro principale (che è migliore dal punto di vista di monitoraggio).

Ho guardato XamlReader come un modo potenziale di fare questo, ma a quanto pare non è adatto per i flussi di lavoro di carico (solo roba UI).

Grazie, Julien

È stato utile?

Soluzione 2

Grazie mille Anthony.

Devo dire che il vostro flusso di lavoro di modifica dinamica è fresco, ma era un po 'paura. Ho finito per comporre i flussi di lavoro mediante una modifica del CallWorkflowActivity di Jon Flander .

Alcuni trucchi che ho imparato con XOML solo flussi di lavoro caricata in fase di esecuzione (utilizzando WF 3.5):

  • rimuovere x: attributo di classe all'interno della XOML

  • cancellare il file code-behind

  • per il progettista VS al lavoro, i file XOML devono essere separati nei propri progetti (nessun codice, come le attività di base o tipi comuni, nel progetto in cui si trova l'XOML)

  • contrassegnare la XOML come contenuti in VS e Copia Sempre così è posto con i tuoi binari

  • anche così, VS 2008 di solito ha bisogno di una ricostruzione completa, al fine di copiare i file correttamente XOML appena modificato ...

  • potrebbe essere necessario impostare manualmente i punti di interruzione, come spiegato qui

Altri suggerimenti

raggiungere il vostro obiettivo qui è probabile che sia abbastanza difficile però lascia l'inizio con la parte più semplice: -

È possibile ricostruire un flusso di lavoro dal XOML utilizzando il WorkflowMarkupSerializer trovato nel namespace System.Workflow.ComponentModel.Serialization.

var serializer = new WorkflowMarkupSerializer();
object root = serializer.Deserialize(myXmlReader);

Allo stesso modo si potrebbe ricostruire un "frammento" di attività tenutosi a qualcosa che eredita dalla CompositeActivity utilizzando il CompostiteActivityMarkupSerializer.

Tuttavia, per integrare la nuova attività principale nel flusso di lavoro attualmente in esecuzione richiede più lavoro. È necessario utilizzare un'istanza della classe WorkflowChanges per rendere la nuova attività dal modifing la definizione del flusso di lavoro utilizzata dall'istanza corrente.

Ora la documentazione è qualche cosa abbozzato e anche un po 'evasiva su questo argomento. Due punti importanti possono essere raccolte se: -

  1. In definitiva una chiamata a ApplyWorkflowChanges è necessario e questo membro ha protected accessibilità.
  2. La documentazione indica che questo deve avvenire l'attività principale di un flusso di lavoro.

Quindi possiamo dedurre che avremo bisogno di un'attività delle radici personalizzato ad almeno contribuire a questo requisito.

Non ci sono probabilmente più modi in cui questo potrebbe essere strutturato ma lascia supporre che abbiamo un SequenceActivity in cui abbiamo un "InvokeWorkflow" l'attività di eseguire la modifica del flusso di lavoro personalizzato e abbiamo intenzione di collocare la nuova attività risultante alla fine di questa sequenza che contiene.

In primo luogo abbiamo bisogno di una definizione di interfaccia, che siamo in grado di implementare l'attività radice personalizzato: -

internal interface IModifiableWorkflow
{
     void ApplyWorkflowChanges(WorkflowChanges workflowChanges);
}

Nella nostra attività principale personalizzato vorremmo implementare questa interfaccia in modo esplicito: -

public class CustomSequentialActivity : SequentialWorkflowActivity, IModifiableWorkflow
{
    void IModifiableWorkflow.ApplyWorkflowChanges(WorkflowChanges workflowChanges)
    {
        base.ApplyWorkflowChanges(workflowChanges);
    }
}

Nel metodo Execute del costume "InvokeWorkflow" attività: -

// Get root activity     
var root = this.Parent;
while (root.Parent != null) { root = root.Parent; }

// Create an instance of WorkflowChanges based on the root activity
var changes = new WorkflowChanges(root);

//Find the parent sequence activity in the transient workflow definition
var target = changes.TransientWorkflow.GetActivityByName(this.Parent.Name);

Activity newActivity = YourCodeToLoadActivityDetailsFromXoml();

target.Activities.Add(newActivity);

//Apply the new changes
((IModifiableWorkflow)root).ApplyWorkflowChanges(changes);

Nota Non ho effettivamente testato niente di tutto questo, il suo messo insieme da briciole di informazioni sepolte nella documentazione.

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