wiki:Documentatie/Ontwikkelaar/OpenAC3/Scriptfuncties

Version 7 (modified by henk, 6 years ago) (diff)

--

TOC(heading=Scriptfuncties)? TOC(heading=OpenAC3, sectionindex, compact, depth=3, allactive, Documentatie/Ontwikkelaar/OpenAC3/)? TOC(heading=Ontwikkelaar, sectionindex, compact, depth=2, allactive, Documentatie/Ontwikkelaar/)? TOC(heading=Documentatie, sectionindex, compact, depth=1, allactive, Documentatie/)?

Scriptfuncties

NoteBox(tip, Deze pagina moet tzt een andere plek krijgen.)?

OpenAC 2 kent zogenaamde scriptfuncties. Dit zijn geregistreerde functies die o.a. worden uitgevoerd bij het opslaan van een entry. Scriptfuncties kunnen controles uitvoeren voordat een actie is uitgevoerd of een nabewerking doen nadat een actie is uitgevoerd.

Hoe en wanneer

Scriptfuncties worden aangeroepen door controllers. Ze kunnen zowel voor als na een actie worden uitgevoerd. Voorbeeld:

var result = await tabelscripts.ExecuteAsync(pe, HubCommand.UPDATE, TabelScriptWhen.AFTER, new TabelScriptResult(formulierPost.Data));

Bovenstaande aanroep zorgt ervoor dat alle scriptfuncties worden uitgevoerd die zijn geregistreerd voor argumenten pad, actie en moment.

Registratie

Alle klassen die interface ITabelScript implementeren worden automatisch geregistreerd als de static constructor van TabelScripts wordt uitgevoerd. Een static constructor wordt gegarandeerd maar één keer uitgevoerd, de eerste keer dat een reguliere constructor van die klasse wordt uitgevoerd.

Om scriptfuncties uit te kunnen voeren moet je eerst klasse TabelScripts instantiëren:

var tabelscripts = new TabelScripts();

Interface ITabelScript

Interface ITabelScript bevat twee functiedefinities:

public interface ITabelScript
{
    IEnumerable<TabelScriptRegistration> RegisterFor { get; }
    Task<TabelScriptResult> ExecuteAsync(IServiceProvider serviceProvider, PathElement path, HubCommand command, TabelScriptWhen when, TabelScriptResult scriptResult);
}


Het is mogelijk om een tabelscript klasse te registreren voor meerdere events (combinatie van pad, actie en moment). Onderstaand een voorbeeld:

public IEnumerable<TabelScriptRegistration> RegisterFor => new List<TabelScriptRegistration> {
    new TabelScriptRegistration { Command = HubCommand.DELETE, When = TabelScriptWhen.BEFORE, Path = "patient/behandelingen/fin_trajecten" },
    new TabelScriptRegistration { Command = HubCommand.DELETE, When = TabelScriptWhen.AFTER, Path = "patient/behandelingen/fin_trajecten" },
    new TabelScriptRegistration { Command = HubCommand.UPDATE, When = TabelScriptWhen.AFTER, Path = "patient/behandelingen/fin_trajecten" }        
};

Voor elk van bovenstaande events zal method ExecuteAsync van de klasse worden uitgevoerd.

ExecuteAsync

Bij elk scriptfunctie event wordt de ExecuteAsync method van alle geregistreerde klassen aangeroepen. Deze functie krijgt een TabelScriptResult mee als argument en geeft ook een TabelelScriptResult terug. Op die manier kunnen meerdere scriptfuncties iets toevoegen aan het uiteindelijke resultaat.

Data en ParentData

In de ExecuteAsync method zijn data die nodig zijn om een UPDATE scriptfunctie uit te voeren beschikbaar in scriptResult.Data. Soms is het ook nodig om te beschikken over de data van een parent. Bijvoorbeeld in een scriptfunctie voor een bezoek kan het nodig zijn om te beschikken over de data van het zorgtraject waar het bezoek bij hoort. Parent data kan worden opgevraagd met de functie scriptResult.GetParent() . Deze functie kan null teruggeven. In dat geval is de conventie om de parent data op te halen en toe te voegen aan scriptResult met scriptResult.SetParent() .

var zorgtrajectData = scriptResult.GetParent("behandeling");
var zorgtrajectPad = path.Pop();
if (zorgtrajectData == null)
{
    var tabelRepo = serviceProvider.GetService<ITabelRepo<Tabel>>();
    zorgtrajectData = await tabelRepo.GetData("behandeling", zorgtrajectPad.Key);
    scriptResult.SetParent("behandeling", zorgtrajectData);
}

Als er meerdere scriptfuncties zijn geregistreerd voor hetzelfde event zorgt bovenstaande design pattern ervoor dat er maar één keer een query wordt uitgevoerd om gegevens van de parent op te halen.