Contesto di esecuzione dei plug-in
Ogni volta che si esegue un plug-in Microsoft Dataverse (o un'estensione del flusso di lavoro personalizzato), questo fornisce una grande quantità di dati sul contesto dell'operazione corrente. Sia i plug-in che gli assembly del flusso di lavoro personalizzati hanno accesso a una classe IWorkflowContext, accessibile tramite metodi diversi.
Nei plug-in, IPluginExecutionContext è accessibile tramite il parametro IServiceProvider del metodo Execute chiamando il metodo GetService.
public class SamplePlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// Obtain the execution context from the service provider.
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
}
}
Nelle estensioni del flusso di lavoro personalizzate, IPluginExecutionContext viene passato come parametro del metodo Execute del tipo CodeActivityContext.
public class SampleWorkflowExtension : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
// Obtain the execution context from the code activity context.
IWorkflowContext workflowContext = context.GetExtension();
}
}
Sia IPluginExecutionContext che IWorkflowContext implementano l'interfaccia IExecutionContext. Ognuno espone anche informazioni specifiche per il proprio tipo. Per altre informazioni, consultare Comprensione del contesto di esecuzione.
Proprietà IExecutionContext
Due delle proprietà più interessanti dell'interfaccia IExecutionContext sono InputParameters e OutputParameters. Altre proprietà usate di frequente sono PreEntityImages, PostEntityImages e SharedVariables.
InputParameters
I parametri di input sono contenuti nella raccolta InputParameters del contesto di esecuzione e sono di tipo Entità. Questa proprietà consente di vedere quali valori di entità sono stati presentati al plug-in prima dell'implementazione di una determinata operazione.
Ad esempio, se si desidera convalidare i propri dati e impedire che vengano salvati se la convalida non ha esito positivo, i passaggi da eseguire saranno simili ai seguenti:
Registrare il plug-in per eseguirlo nella fase PreValidation a fronte della creazione e/o dell'aggiornamento dell'entità che si desidera convalidare.
Convalidare i dati nel plug-in leggendo i valori dalla raccolta InputParameters. Alla creazione, si consiglia di recuperare la raccolta di destinazione.
Generare un'eccezione InvalidPluginExecutionException se i dati forniti non sono validi.
O forse si vuole aggiornare i valori sull'entità (come la rimozione di caratteri speciali da un numero di telefono) prima che i dati vengano salvati. È possibile gestire questa situazione con i seguenti passaggi:
Registrare il plug-in per eseguirlo nella fase Pre-Operation a fronte della creazione e/o dell'aggiornamento dell'entità che si desidera aggiornare.
Aggiornare i dati nel plug-in modificando i valori dalla raccolta InputParameters. Alla creazione, si consiglia di recuperare la raccolta di destinazione.
OutputParameters
I parametri di output sono contenuti nella raccolta OutputParameters del contesto di esecuzione e sono di tipo Entità. I parametri di output vengono forniti solo dopo che si è verificata l'operazione specificata. Pertanto, sarà possibile usare questa raccolta solo quando si gestiscono eventi nella fase PostOperation.
Ad esempio, se si desidera modificare i valori restituiti dall'operazione, è possibile modificarli eseguendo i seguenti passaggi:
Registrare il plug-in per eseguirlo nella fase PostOperation a fronte della creazione e/o dell'aggiornamento dell'entità che si desidera aggiornare.
Aggiornare i dati nel plug-in modificando i valori dalla raccolta OutputParameters. Alla creazione, si consiglia di recuperare la raccolta di destinazione.
PreEntityImages e PostEntityImages
Quando si registrano i plug-in da eseguire sul framework degli eventi, è possibile fornire una copia immutabile, o snapshot, dei dati. Ciò è ideale soprattutto quando è necessario fare riferimento ai valori dei dati prima o dopo che si è verificata un'operazione, ad esempio, per scopi di registrazione o controllo personalizzato.
Sebbene sia possibile recuperare i valori delle entità usando il contesto dell'organizzazione dall'interno di un plug-in con una richiesta di recupero, l'uso di immagini di entità per eseguire questa attività è molto più efficiente e altamente consigliato.
SharedVariables
Le variabili condivise consentono di configurare i dati che possono essere passati da un plug-in a un passaggio che si verifica successivamente nella pipeline di implementazione. Sebbene sia vivamente consigliato configurare i plug-in in modo che siano senza stato e non abbiano dipendenze da eventi esterni, a volte ci sono eccezioni a questa regola.
Un'eccezione potrebbe verificarsi quando si vuole assicurarsi di non avere plug-in "incontrollati" nel proprio ambiente. Si tratta di plug-in attivati in uno scenario ricorsivo infinito. È anche possibile usare il contesto di esecuzione per determinare a quale profondità è attualmente in esecuzione il plug-in, ma in determinate situazioni potrebbe essere appropriato tenerne traccia manualmente. Ad esempio, è possibile che il plug-in avvii erroneamente la logica di aggiornamento all'interno di un plug-in configurato per essere eseguito in caso di aggiornamento dell'entità, che a sua volta ne causa l'esecuzione all'infinito. Per risolvere questo problema, è possibile creare un modello per contare il numero di volte in cui questo plug-in può essere eseguito. Un esempio potrebbe essere la configurazione di un limite di cinque esecuzioni di un plug-in con i seguenti passaggi:
Nel plug-in, controllare se la variabile condivisa RunCount esiste e, in caso contrario, crearne una inizializzata su zero.
Controllare se il valore della variabile RunCount è maggiore di cinque e, in tal caso, generare un'eccezione InvalidPluginExecutionException.
Alla fine del plug-in, incrementare la variabile RunCount di 1.
Nota
Questa è solo una protezione aggiuntiva contro un bug che causa accidentalmente l'overrun delle risorse da parte del plug-in. Occorre assicurarsi di creare i plug-in in modo che questo scenario non si verifichi mai. Dataverse fornisce anche misure di sicurezza per prevenire plug-in "incontrollati" come questi, ma i loro metodi di ripristino richiedono molte più risorse di questo metodo e sono più difficili da diagnosticare.