Code-abgeleiteten Verbände


Dieser Artikel wird Code abgeleitet Assoziationen zu verwenden, um benutzerdefinierte Klasseneinschränkungen implementieren veranschaulichen.

Abgeleiteten Association abgeleiteten Vereinigung ohne ist Code bereitgestellt abgeleitet OCL Ausdruck - die Logik im Code implementiert werden muss.

Bitte lesen Sie Malcolm Groves Artikel, wenn Sie nicht sicher sind, welche abgeleiteten Association ist.

Diese beiden Artikel sind die wichtigsten zum Thema:
ECO: Abgeleiteten Verbände
ECO: Abgeleitete Attribute Teil 2 - Code abgeleitete Attribute

Problem:
Oft Benutzer Fragen uns, ob wir einen oder anderen Bereich unseres Systems obligatorisch machen können.
Sie hätten gerne mehr Felder oder bestimmte Regeln für die Gültigkeitsprüfung, besseren Qualität der gespeicherten Informationen zu erreichen.

Lösung:
Beispielprojekt, die in diesem Artikel verwendeten demonstrieren wie custom, benutzerdefinierte Klasseneinschränkungen für die Person-Klasse implementiert.

Benutzer kann eigene einfache Regeln für die Gültigkeitsprüfung erstellen und System überprüft die Regeln gegen Objekte in Datenbank jedem Benutzer erstellt/Zugänge Objekte oder Änderungen-Attribute Objekt.

Dies unterscheidet sich von der Definition Entwurfszeitklasse Einschränkungen, erfolgt vom Öko-Framework, da Benutzer setzen kann seine eigene Klasseneinschränkungen zur Laufzeit, in Datenbank speichern und verwenden im gesamten System.

In meiner Anwendung habe ich 2 Klassen - Person und PersonConstraint erstellt.

Klasse Person darstellt, Person und seine Attribute und PersonConstraint-Klasse speichert alle benutzerdefinierten Einschränkungen-Regeln für Person-Objekt.

PersonConstraint-Klasse hat String Attribute OCLExpression und ErrorMessage.

Attribut OCLExpression enthält OCL Ausdruck gegen ausgewählte Person-Objekt ausgewertet werden.
Attribut ErrorMessage enthält eine Zeichenfolge im GUI angezeigt, wenn Einschränkungsregel/Validierung fehlgeschlagen ist.

Auch habe ich eine abgeleitete Beziehung zwischen Person und PersonConstraint erstellt.
Assoziationsende BrokenConstraints gibt alle verletzte Einschränkungen für Person-Objekt zurück.

Da ich die angegebenen abgeleitet OCL für die Zuordnung nicht, muss ich Implementierung der abgeleiteten Association in meinem Code bereitstellen.

Für Assoziationsende BrokenConstraints habe ich eine Funktion wie folgt deklariert:

öffentliche IList BrokenConstraintsDeriveAndSubscribe(ISubscriber reEvaluateSubscriber, ISubscriber reSubscribeSubcriber)
{
...
}

Assoziationsende hat Multiplizität n und Funktion sollten IList zurück.

Die anderen Details seiner Deklaration abgeleiteten Attribut Funktion code ähneln (siehe Malcolm Groves Blogs).

In meiner Funktion:

  • Ich erstelle ein neues Objekt, die Implementierung von IList (z. B. ArrayList-Objekt)
  • Gehen Sie durch alle PersonConstrain-Objekte,
  • Jede OCLExpression Person-Objekts zu bewerten,
  • Wenn die Validierung fehlschlägt, ich PersonConstraint Objekt der Liste hinzufügen,
  • Ergebnis-Liste

ECO wird diese Funktion, um BrokenConstraints Assoziationsende abzurufen.

Obwohl Funktion IList zurückgibt, transformiert ECO Rahmen Ergebnis mit IPersonConstraintList (Dies geschieht durch Adapterklasse im Rahmen).

Um erneut auszuwerten BrokenConstraints für jedes Objekt, jedes Mal, wenn Objekt aktualisiert wird, abonnieren ich auf Person Objektänderungen mit ReEvaluateSubscriber und ReSubscribeSubcriber wie folgt:

OS. EvaluateAndSubscribe (this. AsIObject(), c.OCLExpression, ReEvaluateSubscriber, ReSubscribeSubcriber)

Eine andere Sache (Dank an Jan Norden Hilfe) ist auf PersonConstraints' OCL Ausdrücke Änderungen abonnieren:

OS. EvaluateAndSubscribe (Null, 'PersonConstraint.allInstances.OCLExpression', ReEvaluateSubscriber, ReSubscribeSubcriber);

Dieses Abonnement zwingt alle OCLExpressions für alle vorhandenen Person-Objekte neu bewertet werden, wenn neue PersonConstraint hinzugefügt wird.

Dies ist, wie mein Code Verband Funktion sieht abgeleitet:
öffentliche IList BrokenConstraintsDeriveAndSubscribe(ISubscriber reEvaluateSubscriber,
ISubscriber-ReSubscribeSubcriber)
{
ArrayList BrokenConstraints = new ArrayList();
IObjectList Einschränkungen = Null;
IOclService os =
(IOclService) AsIObject(). ServiceProvider.GetEcoService)
typeof(IOclService));
IElement e = Null;
Objekt OCLResult = Null;

Alle Einschränkungen zu erhalten
e = os. EvaluateAndSubscribe (Null,
'PersonConstraint.allInstances', null, Null);
if (e IObjectList)
Einschränkungen (IObjectList) e; =

auf alle OCLExpressions abonnieren
OS. EvaluateAndSubscribe (Null,
'PersonConstraint.allInstances.OCLExpression'
ReEvaluateSubscriber, ReSubscribeSubcriber);

gehen Sie durch alle Einschränkungen und Auswerten von Ausdrücken für das Objekt
für (Int i = 0; i < Einschränkungen. Anzahl der Themen; i++)
{
PersonConstraint c = Einschränkungen [i]. AsObject als PersonConstraint;

Wenn (c.OCLExpression == '')
weiter;

e = os. EvaluateAndSubscribe (this. AsIObject(), c.OCLExpression,
ReEvaluateSubscriber, ReSubscribeSubcriber);
Wenn (e! = Null)
OCLResult = e.AsObject;

Liste fügen Sie hinzu, wenn die Einschränkung ist gebrochen
If (!. Convert.ToBoolean(OCLResult))
brokenConstraints.Add(c);
}

Rückkehr BrokenConstraints;
}

Und das ist meine Bewerbung:

Jetzt kann ich meine eigenen Einschränkungen/Klassenordnung Eingabe OCL Ausdrücke und Fehlermeldungen erstellen.

Jedes Mal, wenn ich Person-Objekt zugreifen, oder ändern Sie seine Attribute, Programm wertet diese OCL-Ausdrücke und zeigt eine Liste der Fehlermeldungen für ausgewählte Person-Objekt.
Wenn ich mehr Regeln hinzufügen, erhalten sie ausgewählte Person-Objekts überprüft.

Sobald die ausgewählte Person Objekt meine benutzerdefinierte Klasseneinschränkungen entspricht, verschwinden Fehlermeldungen.

Source-Code kann hier heruntergeladen werden.









Code-abgeleiteten Verbände


Code-abgeleiteten Verbände : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Dieser Artikel wird Code abgeleitet Assoziationen zu verwenden, um benutzerdefinierte Klasseneinschränkungen implementieren veranschaulichen.

Abgeleiteten Association abgeleiteten Vereinigung ohne ist Code bereitgestellt abgeleitet OCL Ausdruck - die Logik im Code implementiert werden muss.

Bitte lesen Sie Malcolm Groves Artikel, wenn Sie nicht sicher sind, welche abgeleiteten Association ist.

Diese beiden Artikel sind die wichtigsten zum Thema:
ECO: Abgeleiteten Verbände
ECO: Abgeleitete Attribute Teil 2 - Code abgeleitete Attribute

Problem:
Oft Benutzer Fragen uns, ob wir einen oder anderen Bereich unseres Systems obligatorisch machen können.
Sie hätten gerne mehr Felder oder bestimmte Regeln für die Gültigkeitsprüfung, besseren Qualität der gespeicherten Informationen zu erreichen.

Lösung:
Beispielprojekt, die in diesem Artikel verwendeten demonstrieren wie custom, benutzerdefinierte Klasseneinschränkungen für die Person-Klasse implementiert.

Benutzer kann eigene einfache Regeln für die Gültigkeitsprüfung erstellen und System überprüft die Regeln gegen Objekte in Datenbank jedem Benutzer erstellt/Zugänge Objekte oder Änderungen-Attribute Objekt.

Dies unterscheidet sich von der Definition Entwurfszeitklasse Einschränkungen, erfolgt vom Öko-Framework, da Benutzer setzen kann seine eigene Klasseneinschränkungen zur Laufzeit, in Datenbank speichern und verwenden im gesamten System.

In meiner Anwendung habe ich 2 Klassen - Person und PersonConstraint erstellt.

Klasse Person darstellt, Person und seine Attribute und PersonConstraint-Klasse speichert alle benutzerdefinierten Einschränkungen-Regeln für Person-Objekt.

PersonConstraint-Klasse hat String Attribute OCLExpression und ErrorMessage.

Attribut OCLExpression enthält OCL Ausdruck gegen ausgewählte Person-Objekt ausgewertet werden.
Attribut ErrorMessage enthält eine Zeichenfolge im GUI angezeigt, wenn Einschränkungsregel/Validierung fehlgeschlagen ist.

Auch habe ich eine abgeleitete Beziehung zwischen Person und PersonConstraint erstellt.
Assoziationsende BrokenConstraints gibt alle verletzte Einschränkungen für Person-Objekt zurück.

Da ich die angegebenen abgeleitet OCL für die Zuordnung nicht, muss ich Implementierung der abgeleiteten Association in meinem Code bereitstellen.

Für Assoziationsende BrokenConstraints habe ich eine Funktion wie folgt deklariert:

öffentliche IList BrokenConstraintsDeriveAndSubscribe(ISubscriber reEvaluateSubscriber, ISubscriber reSubscribeSubcriber)
{
...
}

Assoziationsende hat Multiplizität n und Funktion sollten IList zurück.

Die anderen Details seiner Deklaration abgeleiteten Attribut Funktion code ähneln (siehe Malcolm Groves Blogs).

In meiner Funktion:

  • Ich erstelle ein neues Objekt, die Implementierung von IList (z. B. ArrayList-Objekt)
  • Gehen Sie durch alle PersonConstrain-Objekte,
  • Jede OCLExpression Person-Objekts zu bewerten,
  • Wenn die Validierung fehlschlägt, ich PersonConstraint Objekt der Liste hinzufügen,
  • Ergebnis-Liste

ECO wird diese Funktion, um BrokenConstraints Assoziationsende abzurufen.

Obwohl Funktion IList zurückgibt, transformiert ECO Rahmen Ergebnis mit IPersonConstraintList (Dies geschieht durch Adapterklasse im Rahmen).

Um erneut auszuwerten BrokenConstraints für jedes Objekt, jedes Mal, wenn Objekt aktualisiert wird, abonnieren ich auf Person Objektänderungen mit ReEvaluateSubscriber und ReSubscribeSubcriber wie folgt:

OS. EvaluateAndSubscribe (this. AsIObject(), c.OCLExpression, ReEvaluateSubscriber, ReSubscribeSubcriber)

Eine andere Sache (Dank an Jan Norden Hilfe) ist auf PersonConstraints' OCL Ausdrücke Änderungen abonnieren:

OS. EvaluateAndSubscribe (Null, 'PersonConstraint.allInstances.OCLExpression', ReEvaluateSubscriber, ReSubscribeSubcriber);

Dieses Abonnement zwingt alle OCLExpressions für alle vorhandenen Person-Objekte neu bewertet werden, wenn neue PersonConstraint hinzugefügt wird.

Dies ist, wie mein Code Verband Funktion sieht abgeleitet:
öffentliche IList BrokenConstraintsDeriveAndSubscribe(ISubscriber reEvaluateSubscriber,
ISubscriber-ReSubscribeSubcriber)
{
ArrayList BrokenConstraints = new ArrayList();
IObjectList Einschränkungen = Null;
IOclService os =
(IOclService) AsIObject(). ServiceProvider.GetEcoService)
typeof(IOclService));
IElement e = Null;
Objekt OCLResult = Null;

Alle Einschränkungen zu erhalten
e = os. EvaluateAndSubscribe (Null,
'PersonConstraint.allInstances', null, Null);
if (e IObjectList)
Einschränkungen (IObjectList) e; =

auf alle OCLExpressions abonnieren
OS. EvaluateAndSubscribe (Null,
'PersonConstraint.allInstances.OCLExpression'
ReEvaluateSubscriber, ReSubscribeSubcriber);

gehen Sie durch alle Einschränkungen und Auswerten von Ausdrücken für das Objekt
für (Int i = 0; i < Einschränkungen. Anzahl der Themen; i++)
{
PersonConstraint c = Einschränkungen [i]. AsObject als PersonConstraint;

Wenn (c.OCLExpression == '')
weiter;

e = os. EvaluateAndSubscribe (this. AsIObject(), c.OCLExpression,
ReEvaluateSubscriber, ReSubscribeSubcriber);
Wenn (e! = Null)
OCLResult = e.AsObject;

Liste fügen Sie hinzu, wenn die Einschränkung ist gebrochen
If (!. Convert.ToBoolean(OCLResult))
brokenConstraints.Add(c);
}

Rückkehr BrokenConstraints;
}

Und das ist meine Bewerbung:

Jetzt kann ich meine eigenen Einschränkungen/Klassenordnung Eingabe OCL Ausdrücke und Fehlermeldungen erstellen.

Jedes Mal, wenn ich Person-Objekt zugreifen, oder ändern Sie seine Attribute, Programm wertet diese OCL-Ausdrücke und zeigt eine Liste der Fehlermeldungen für ausgewählte Person-Objekt.
Wenn ich mehr Regeln hinzufügen, erhalten sie ausgewählte Person-Objekts überprüft.

Sobald die ausgewählte Person Objekt meine benutzerdefinierte Klasseneinschränkungen entspricht, verschwinden Fehlermeldungen.

Source-Code kann hier heruntergeladen werden.


Code-abgeleiteten Verbände

Code-abgeleiteten Verbände : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Code-abgeleiteten Verbände
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung