Bin mir nicht sicher ob es die Überschrift wirklich trifft, klingt wirklich hochtrabend, aber was solls 
Um was gehts
Im laufe diverser Projekte in den letzten zwei Jahren, bei denen ich unter anderem typsisierte DataSets eingesetzt habe, haben sich einige Gedanken und Ideen entwickelt die ich hier im folgenden (etwas ungeordnet vielleicht) niederschreiben möchte.
Begonnen hat das Ganze damit, dass ich einfache typisierte DataSets eingesetzt habe um auf Zeileninhalte zuzugreifen.
Also aus
if (Convert.ToDateTime(Row["Anfang"]))>=DateTime.Now.Date) .....
wurde
if (Row.Anfang>=DateTime.Now.Date)...
dies hat auf den ersten Blick mehrere Vorteile:
- erhöhte leserlichkeit des Codes
- IntelliSense über die zur Verfügung stehenden Spalten und damit weniger Schreibfehler bei der Spaltenbenennung
- strenge Prüfung der Spaltenzugriffe bereits zur Compilierzeit
Zusätzlich ergeben sich noch ein paar strategische Vorteile in der Wartung und Anpassung der Applikation!
Grundsätzlich ist es dann ja so, dass Änderungen Am DataSet (eine Spalte existiert plötzlich nicht mehr, oder ändert den grundlegenden Datentyp) schon vom Compiler aufgeworfen werden, und damit die meisten Abhängigkeiten aufgedeckt und angepasst werden können (mit dem Compiler!)
Grundsätzlich arbeite ich bei typsisierten DataSets immer mit/über XSD-Schemas.
Zwei Beispiele
Beispiel 1
Eine Anwendung verwendet ein serialisisertes typisiertes DataSet als Speicherformat (DataSet als mini-Access sozusagen)
Dabei wird das zu Grunde liegende XSD-File mit einem Hilfsprojekt erzeugt (
DataSet wird mit DataTables, Columns, Relations aufgebaut und mit WriteSchema(@"MyDataSet.xsd") in ein XSD File umgewandelt!
Dieses XSDFile wird nun in ein VS.2005 Projekt aufgenommen welches daraus automatisch ein typisiertes DataSet erzeugt.
Sind nun für eine neue Version der Anwendung Änderungen am DataSet notwendig so gehe ich in das HIlfsprojekt und ändere die XSD-Generierung entsprechend, fürhre Sie aus und Refreshe das nun frisch generierte XSD im Hauptprojekt (Run Custom Tool im VS.2005). Damit wird die neueste Version des typsisierten DataSets erzeugt und wenn ich anschließend die gesamte Anwendung compiliere, schreit der schreit der Compiler sofort lautstark auf falls sich etwas grundlegendes verändert haben sollte und ich kann entsprechend reagieren!
Beispiel 2
Bei Datenbankanwendungen (meist SQL-Server) gehe ich folgendermassen vor!
Ich erzeuge und definiere Datenbank und Tabellenstruktur. Diese Datenbank stellt das sogenannte Referenzsystem dar.
Nun definiere ich ein DataSet (es umfasst meist einen Ausschnitt aus der Datenbank, ein Projekt enthält oft dutzende von unterschiedlichen DataSets) indem ich es mit Tabellen aus der Datenbank befülle und die Beziehungen zwischen den Tabellen definiere.
Das Ergebnis wandle ich mit WriteSchema in ein XSD-File um welches nun in das VS.2005 Projekt eingebunden und wie im obigen Projekt verwendet wird.
Zur Laufzeit muss dann "nur" noch dieses DataSet mit DAten befüllt werden.
Sind jetzt Änderungen an der Anwendung, an der Datenbank erforderlich so kann ich diese direkt auf der Referenzdatenbank machen!
Anschließend lasse ich drauas wiederum das XSD-File generieren und voila, die ganze Anwendung wird vom Compiler automatisch gegen die neue Datenbankstruktur geprüft.
Was das Ganze mit MetaModellen und Architktur zu tun hat ?
Naja hier wird im ersten Ansatz mal gezeigt wie man z.B. die MetaDaten der Datenbank mit dem Anwendungscode verknüpfen kann (typisiertes DataSet aus XSD)
und diesen Ansatz werden ich demnächst noch weiterspinnen (und es wird ein langer Faden werden)