Kode avledet associations

Denne artikkelen vil demonstrere hvordan man bruker kode avledet foreninger til å gjennomføre brukerdefinerte klasse begrensninger
kode avledet foreningen er avledet forening uten forutsatt Avledet OCL uttrykk -.. Logikken må implementeres i koden
Vennligst les Malcolm Groves 'artikler hvis du ikke er sikker på hva avledet foreningen er
Disse to artiklene som er mest relevant til emnet: ECO: avledet AssociationsECO: avledet attributter del 2 - Kode avledet attributter
problem:.
Ofte brukere spør oss om vi kan gjøre en eller annen innen vårt system mandatory.They vil gjerne ha flere nødvendige felt eller visse data valideringsregler for å oppnå bedre kvalitet på lagret informasjon
Løsning:.
Prøve prosjektet brukes i denne artikkelen vil demonstrere hvordan å implementere tilpassede, brukerdefinerte klassebegrensninger for person-klassen.
Brukeren kan lage sine egne enkle data valideringsregler og systemet vil sjekke reglene mot objektene i databasen hver gang brukeren oppretter /tilgang til gjenstander eller endringer objekt attributter.
Dette er forskjellig fra å definere utformingen-time klasse begrensninger, som leveres av ECO rammeverk, fordi brukeren vil kunne sette sine egne klasse begrensninger i kjøretid, lagre dem i databasen og bruke gjennom hele systemet
i søknaden min har jeg laget 2 klasser -.. person og PersonConstraint
klasse person representerer person og dets attributter og klasse PersonConstraint lagrer alle brukerdefinerte begrensninger-regler for person objekt
PersonConstraint. klasse har streng attributter OCLExpression og Errormessage.
data OCLExpression inneholder OCL uttrykk som skal evalueres mot valgt person objekt. Attributt Errormessage inneholder en streng som skal vises i GUI hvis begrensningen /regelen validering mislyktes.
Jeg har også opprettet en avledet sammenheng mellom person og PersonConstraint.Association slutt BrokenConstraints returnerer alle krenket begrensninger for Person objekt.
Fordi jeg ikke spesifisert avledet OCL for foreningen, jeg trenger å gi implementering av avledet foreningen i min kode
for foreningen end BrokenConstraints jeg laget en funksjon erklært som dette:.
offentlig IList BrokenConstraintsDeriveAndSubscribe (ISubscriber reEvaluateSubscriber, ISubscriber reSubscribeSubcriber) {.. .}
Association enden har mangfold n og funksjonen skal returnere IList
Den andre detaljer om sin erklæring er lik kode avledet attributt funksjon (se Malcolm Groves blogger)
i min funksjon.:.
< li> jeg oppretter et nytt objekt å implementere IList (for eksempel Arraylist objekt), etter
Gå gjennom alle PersonConstrain gjenstander, etter
Evaluer hver OCLExpression på person objekt, etter
Hvis validering mislykkes, jeg legge PersonConstraint objekt i listen, etter
Gå tilbake resultatlisten
ECO bruker denne funksjonen for å få BrokenConstraints forening slutten.
Selv om funksjonen returnerer IList, ECO rammeverk forvandler resultat . til IPersonConstraintList (dette gjøres ved adapter klasse innenfor rammen)
til revurdere BrokenConstraints for hvert objekt, blir hver gang objekt oppdatert, jeg abonnere på person objektet endres ved hjelp reEvaluateSubscriber og reSubscribeSubcriber som dette:
os.EvaluateAndSubscribe ( this.AsIObject (), c.OCLExpression, reEvaluateSubscriber, reSubscribeSubcriber)
En annen ting (takk til jan Norden om hjelp) er å abonnere på PersonConstraints 'OCL uttrykk endringer:
os.EvaluateAndSubscribe (null, "PersonConstraint.allInstances .OCLExpression ", reEvaluateSubscriber, reSubscribeSubcriber);
Dette abonnementet tvinger alle OCLExpressions skal revurderes for alle eksisterende person objekter når nye PersonConstraint legges
Dette er hvordan min kode avledet foreningen funksjon ser ut: offentlig IList BrokenConstraintsDeriveAndSubscribe (ISubscriber reEvaluateSubscriber. , ISubscriber reSubscribeSubcriber) {Arraylist brokenConstraints = ny Arraylist (); IObjectList begrensninger = null; . IOclService os = (IOclService) AsIObject () ServiceProvider.GetEcoService (typeof (IOclService)); IElement e = null; protestere OCLResult = null;
//Få all begrensninger e = os.EvaluateAndSubscribe (null, "PersonConstraint.allInstances", null, null); if (e er IObjectList) begrensninger = (IObjectList) e;
//abonnere på alle OCLExpressions os.EvaluateAndSubscribe (null, "PersonConstraint.allInstances.OCLExpression", reEvaluateSubscriber, reSubscribeSubcriber);
//gå gjennom alle begrensninger og behandle uttrykk på objektet for (int i = 0; i < constraints.Count; i ++) {PersonConstraint c = begrensninger [i] .AsObject som PersonConstraint;
if (c.OCLExpression == "") fortsetter;
e = os.EvaluateAndSubscribe (this.AsIObject (), c.OCLExpression, reEvaluateSubscriber, reSubscribeSubcriber); if (! e = null) OCLResult = e.AsObject;
//Legg til liste hvis begrensningen er brutt hvis brokenConstraints.Add (c) (Convert.ToBoolean (OCLResult)!); }
Gå tilbake brokenConstraints;}
Og dette er min søknad:
Nå kan jeg lage min egen klasse begrensninger /regler taste OCL uttrykk og Feilmeldinger
Hver gang jeg tilgang Person objekt eller. endre sine attributter, evaluerer program disse OCL uttrykk og viser en liste over feilmeldinger for den valgte person object.If jeg legge til flere regler, de blir godkjent for valgt person objekt.
så snart valgt person objekt sams mine egendefinerte klassebegrensninger, feil~~POS=TRUNC meldinger~~POS=HEADCOMP forsvinner.
Kildekoden koden~~POS=HEADCOMP kan lastes ned herfra.