![]() | eigene ValueModifier |
Dieses Kapitel handelt von selbst erstellten ValueModifiern.
Eigene ValueModifier werden Sie eher selten benötigen, da Vishnu schon
ValueModifier für die Standard-Ergebnistypen Boolean,
alle Integer-Typen, DateTime und
String mit Standard-C#-Formatierungen mitbringt.
Was ValueModifier überhaupt sind und wie sie verwendet werden, wird ausführlich im Kapitel
Vishnu Akteure unter ValueModifier
beschrieben.
Nehmen wir einmal an, Sie kommen mit den Vishnu-ValueModifiern nicht mehr aus und müssen eine erweiterte Logik implementieren oder einen besonderen Ergebnistyp behandeln. Genau dafür sind eigene ValueModifier gedacht.
Im nachfolgenden Beispiel soll zu einem vorgegebenen Datum die zugehörige Mondphase dargestellt werden. Der interne Ergebnistyp ist zwar, wie Sie weiter unten sehen können, einfach nur Int32, aber die Umsetzung des Datums in den Wert einer Mondphase erfordert eine eigene Logik.
![]() |
---|
Das nachfolgende Beispiel zeigt nebenbei auch noch mal eine Anwendung für eigene Views. Danke auch an https://www.freeimages.com/illustrations/vector/moonphase. |
So sieht der Demo-Job für eigene ValueModifier im Betrieb aus:
Über den Dialog DatumInput kann ein Datum eingegeben (oder ausgewählt) werden, welches im Knoten Mondphase als Abbildung der zu dem Datum passenden Mondphase dargestellt wird.
Dies ist die JobDescription.xml für den Demo-Job für eigene ValueModifier:
<?xml version="1.0" encoding="utf-8"?> <JobDescription> <LogicalName>CheckUserValueModifier</LogicalName> <LogicalExpression> DatumInput AND Mondphase </LogicalExpression> <Checkers type="array"> <Checker> <LogicalName>DatumInput</LogicalName> <PhysicalPath>WPFDateDialog.dll</PhysicalPath> </Checker> </Checkers> <ValueModifiers> <ValueModifier> <LogicalName>Mondphase</LogicalName> <UserControlPath>Plugin\SingleNodeUserControl_CheckMoonPhase.dll</UserControlPath> <Reference>DatumInput</Reference> <PhysicalPath>Plugin\DateToMoonage.dll</PhysicalPath> <Type>Object</Type> </ValueModifier> </ValueModifiers> </JobDescription>
Wie man sieht, wird über die Anweisung
<PhysicalPath>Plugin\DateToMoonage.dll</PhysicalPath>/<PhysicalPath>Plugin\DateToMoonage.dll</PhysicalPath> auf den eigenen
UserValueModifier verwiesen.
Der Typ wird für Vishnu allgemein auf Object festgelegt. Für die korrekte Behandlung
des tatsächlichen Ergebnistyps sind dann der UserValueModifier und die
UserView SingleNodeUserControl_CheckMoonPhase.dll verantwortlich.
Der UserValueModifier DateToMoonage.dll ist wiederum für die korrekte Behandlung des Ergebnisses des Knotens DatumInput verantwortlich, auf den mit der Anweisung <Reference>DatumInput</Reference>/<Reference>DatumInput</Reference> verwiesen wird.
Die Klasse DateToMoonAge muss die Schnittstelle IValueModifier implementieren, wie im nachfolgenden Code-Ausschnitt zu sehen ist.
... /// <summary> /// Konvertiert ein übergebenes Datum in das zugehörige Mondalter in Tagen. /// </summary> /// <remarks> /// File: DateToMoonAge.cs /// Autor: Erik Nagel, NetEti /// Herzlichen Dank an Mostafa Kaisoun für seine Berechnungslogik /// https://www.codeproject.com/script/Membership/View.aspx?mid=1961229 /// /// 04.04.2020 Erik Nagel: erstellt /// </remarks> public class DateToMoonAge : IValueModifier { /// <summary> /// Konvertiert ein übergebenes Datum in das zugehörige Mondalter in Tagen. /// </summary> /// <param name="toConvert">Datum als DateTime.</param> /// <returns>Mondalter in Tagen.</returns> public object ModifyValue(object toConvert) { if (toConvert is DateTime) { if (toConvert != null) { DateTime inDateTime = (DateTime)toConvert; return new DateToMoonAge_ReturnObject(this.MoonAge(inDateTime.Day, inDateTime.Month, inDateTime.Year)); } else { return toConvert; } } else { throw new ArgumentException(String.Format("{0}: kann {1} nicht konvertieren, erwartet wird DateTime", this.GetType().Name, toConvert.ToString())); } } ... private int MoonAge(int d, int m, int y) { ... } ... } ...
![]() |
---|
An dieser Stelle nochmal herzlichen Dank an Mostafa Kaisoun für seine Berechnungslogik (https://www.codeproject.com/script/Membership/View.aspx?mid=1961229). Wie die Berechnung im Detail erfolgt, ist hier nicht wesentlich, entscheidend ist nur, dass sie ein Ergebnis vom Typ int (entspricht Int32) liefert. |
Die Klasse DateToMoonAge returniert ein Objekt vom Typ DateToMoonAge_ReturnObject. Der folgenden Code-Ausschnitt zeigt Auszüge aus der zugehörigen Klasse.
... /// <summary> /// ReturnObject für das Ergebnis des DateToMoonAge ValueModifiers. /// </summary> /// <remarks> /// Autor: Erik Nagel, NetEti /// /// 04.04.2020 Erik Nagel: erstellt /// </remarks> [DataContract] //[Serializable()] public class DateToMoonAge_ReturnObject { /// <summary> /// Mondalter in Tagen. /// </summary> [DataMember] public int MoonAge { get; set; } ... /// <summary> /// Konstruktor - übernimmt einen String-Wert für die DefaultResultProperty. /// </summary> /// <param name="resultProperty">Int-Wert für die MoonAgeProperty</param> public DateToMoonAge_ReturnObject(int resultProperty) { this.MoonAge = resultProperty; } // Es folgen Serialisierungs- und De-Serialisierung-Routinen ... } ...
Diese Klasse dient dazu, das Ergebnis von DateToMoonAge.cs durch die Vishnu-Verarbeitung (als anonymes Objekt) zu transportieren. SingleNodeUserControl_CheckMoonPhase.dll löst das für Vishnu anonyme Objekt dann wieder als DateToMoonAge_ReturnObject auf. Damit das funktioniert, müssen in DateToMoonAge_ReturnObject Routinen für die Serialisierung und De-Serialisierung der zu transportierenden Daten (hier die Property DateToMoonAge_ReturnObject) implementiert werden.
Die Serialisierung und De-Serialisierung ist im Prinzip immer gleichartig und wurde schon ausführlich im Kapitel eigene Views im Unterpunkt Serialisierung beschrieben. Bitte lesen Sie gegebenenfalls dort nach.
![]() |
---|
Alle Code-Auszüge beschränken sich auf die für die Erklärung notwendigen Teile. Wenn Sie sich für weitere Details interessieren, können Sie jederzeit die Originalquellen hinzuziehen. |