quikino „quino - encodo systems ag...quino wird ausgesprochen als kē-′nō quino ermöglicht...
Post on 07-May-2020
4 Views
Preview:
TRANSCRIPT
QuickInfo „Quino“
Quino wird ausgesprochen als kē-′nō
Quino ermöglicht modellgesteuerte Softwareentwicklung mit .Net
Einfache Unterstützung von .Net- und Dritthersteller-Komponentensammlungen
Modulares System dessen einzelne Subsysteme auch eigenständig verwendet werden können
Einleitung
In Entwicklung (Version 0.3)
Anhand der aktuellen Kundenprojekte
weiterentwickelt
Ausgelegt für Munjari
Implementationsstand
Status
Modellierung per C# Sourcecode
Automatische Schemaprüfung und –migration
Persistenz (aufgesetzt auf ADO.Net)
– Postgres: productive
– MSSQL: experimental
GUI-Helpers und -Controls für WinForms und
ASP.Net
Eigene Expression-Sprache
Implementationsstand
Umfang / Features
Arbeitsweise
Modellieren
Schema migrieren
Code Generieren
UI und Logik implementieren
Ausführen / Testen
Das Modell wird zur Laufzeit durch MetaModelGenerator-Ableitungen im Speicher generiert / gebaut.
Das Modell
Modularisierung
public class CoreModelGenerator : MetaModelGenerator
{
public static void AddToModel(IMetaModel baseModel)
{
...
IMainModuleAspect mainModule =
baseModel.Aspects.FindFirst<IMainModuleAspect>();
MetaBuilder builder = new MetaBuilder(baseModel);
IModuleAspect module = new ModuleAspect(mainModule, "Core");
...
}
}
Das Modell
Klassen und Klassenvererbung
// Person
IMetaClass person = builder.AddClassWithDefaultPrimaryKey(
"Person",
...)
);
// Teacher
IMetaClass teacher = builder.AddWrapperClass(
person,
"Teacher",
new Guid("B406D15A-611B-11DC-BA95-754F56D89593")
);
// Student
IMetaClass student = builder.AddWrapperClass(
person,
"Student",
...
);
Das Modell
Klasseneigenschaften und Felder
// Person
person.Caption = "Dozent/Lernender";
person.PluralCaption = "Dozenten und Lernende";
prop = builder.AddProperty(
person,
"Name",
MetaType.Text,
...
);
prop.Caption = "Nachname";
prop.MaximumSize = MaximumNameSize;
builder.AddSort(person, "Name");
builder.AddSort(person, "FirstName");
Methoden können im Modell erfasst werden.
Methoden werden von einigen UI-Controls autom. als Buttons gerendert.
Schichtentrennung wird unterstützt
Das Modell
Methoden
IMetaMethod method = builder.AddMethod(
classClass,
"GenerateGroups",
"Gruppen erstellen"
);
method.Action = delegate(object sender, IMetaMethod method)
{
DoSomethingNiceInHere(sender);
};
Aspekte sind kleine, typisierte „Konfigurations-Rucksäcke“ welche den Modell-Elementen wie Klassen und Properties angehängt werden können.
Das Modell
Aspekte
IMetaProperty prop = ... ;
IViewPropertyAspect propAspect = new ViewPropertyAspect();
propAspect.IsVisible = false;
prop.Aspects.Add(propAspect);
IViewClassAspect personAspect = new ViewClassAspect();
personAspect.Icon = personIcon;
person.Aspects.Add(classAspect);
builder.AddSort(person, "Name");
builder.AddSort(person, "FirstName");
Pfade definieren Datenbeziehungen
Pfade sind bi-direktional
Aus Pfaden werden optional uni-direktionale Relationen gebaut
– Pfad: Buchung Konto
– Relation: Buchung.SollKonto, Buchung.HabenKonto
Pfade werden nie angezeigt, Relationen aber schon
Das Modell
Pfade
builder.AddOneToManyPath(
"Person_Contact",
person, "Id",
contact, "PersonId",
...
);
Relationen können Aspekte haben, welche die Darstellung der Relation im UI beeinflussen
Das Modell
Relationen
IMetaProperty prop = builder.AddRelation(
person,
"Contact",
"Kontaktinformationen",
"Person_Contact"
);
builder.AddRelationAspect(prop, ViewRelationDisplayType.ScrollableDetails);
builder.AddRelationGroupAspect(prop);
Item- und Listklassen mittels Generics
Generische Queries
Queries
IQuery query = new Query(Student.Metadata);
query.WhereEquals(Student.Fields.Id, studentId);
IDataItem<Student> studentItem = connection.GetItem<Student>(query);
studentItem.Load();
if (studentItem.Stored)
{
Console.WriteLine(studentItem.Object.Firstname);
}
Support für Zeitachse im Framework
Typisiertes Resultset mit n Datensätzen
Queries
Abfrage für n Datensätze mit Zeitachse
IQuery query = new Query(StudentGroup.Metadata);
query.WhereEquals(StudentGroup.Fields.GroupId, groupId);
query.CustomData.Add(new TimelineOptions(TimelineOperator.Equal, date));
IDataList<StudentGroup> studentsInGroup =
connection.GetList<StudentGroup>(query);
studentsInGroup.LoadObjectsInQuery();
foreach (StudentGroup studentGroup in studentsInGroup)
{
...
}
Mehrere OrderBy() für Sortierung
Verschachtelte Join‘s mit Where-Statement
Unterstützung von Distinct
Queries
Komplexe Abfrage mit Join
IQuery query = new Query(Absence.Metadata);
query.WhereEquals(Absence.Fields.OnHold, false);
query.OrderBy(Absence.Fields.ToDate, SortDirection.Ascending);
query.OrderBy(Absence.Fields.FromDate, SortDirection.Ascending);
query.Distinct = true;
query.Join(Absence.Relations.Student, QueryJoinCondition.All).
Join(Student.Relations.Classes, QueryJoinCondition.All).
Join(StudentClass.Relations.Class, QueryJoinCondition.All).
Join(Class.Relations.Teachers, QueryJoinCondition.All).
WhereEquals(ClassTeacher.Fields.TeacherId, teacher.Id);
IDataList<Absence> openAbsencesList = connection.GetList<Absence>(query);
openAbsencesList.LoadObjectsInQuery();
Typisierte Inserts
Bulk-Inserts möglich mittels IDataList<T>
Insert
Einfacher Insert eines Datensatzes
IDataItem<LogEntry> newLogEntry = connection.GetItem<LogEntry>();
newLogEntry.Create();
newLogEntry.Object.AbsenceId = absence.Id;
newLogEntry.Object.AuthorId = author.Id;
newLogEntry.Object.KindEnum = kind;
newLogEntry.Object.DateTime = time;
newLogEntry.Object.Description = description;
newLogEntry.Save();
Typisierte Updates
Bulk-Updates möglich mittels IDataList<T>
Update
Einfacher Update eines Datensatzes
IQuery query = new Query(Absence.Metadata);
query.WhereEquals(Absence.Fields.Id, absenceId);
IDataItem<Absence> absence = connection.GetItem<Absence>(query);
absence.Load();
if (absence.Stored)
{
absence.Object.OnHold = isOnHold;
absence.Object.LastTransition = DateTime.Now;
absence.Save();
...
Wechsel auf .Net 3.5 (asap)
Evtl. Support für DLinq und Entity-Framework
Integration der Quino-Tools in Visual Studio 2008
Weitere GUI-Helper und –Controls für WinForms und
Web
Support für Reporting
Modell als Textformat (ohne Sourcecode)
Munjari
Zukunft
Geplant
Vielen Dank für die Aufmerksamkeit. Fragen?
Ende
top related