Ich erstelle eine n-tier Anwendungsarchitektur. Verschiedene Schichten weiß nichts von jeder anderen internen Implementierungen und die Kommunikation zwischen Schichten wird Trog sehr enge Schnittstellen mit IoC/DI unterstützt behandelt.
Jetzt übergebe ich Geschäftsobjekte (definiert in der Geschäftsschicht) an die Datenschicht. Die Geschäftsschicht selbst weiß nicht, wie und wo die Daten tatsächlich gespeichert werden (normalerweise in der Datenbank, aber die Geschäftsschicht sollte das nicht wissen). Die Geschäftsobjekte werden durch die Implementierung von IDataReader an die Datenschicht übergeben (dieser Ansatz unterstützt auch das Massenladen von Daten in zukünftigen Szenarien). Die Datenschicht liest alle Daten aus IDataReader und ruft eine gespeicherte Prozedur auf, um die Daten in der Datenbank zu speichern (wenn ein Objekt gespeichert wird, gibt IDataReader "eine Zeile" zurück).
Das eigentliche Problem liegt hier:
Weil ich gerade IDataReader an die Datenschicht übergeben und Daten von seinem Typ zu trennen, was ist der beste Weg in diesem Fall zu bestimmen, Ort der Daten?
Wenn ich zum Beispiel ein aktuelles Geschäftsobjekt vom Typ "Benutzer" an die Datenschicht übergebe, dann sollte die Datenschicht die Daten in der Tabelle "Benutzer" speichern. In anderen Fällen können die Daten unabhängig vom Typ in der Geschäftsschicht in einer anderen Struktur gespeichert werden.
In der aktuellen Implementierung übergebe ich Typinformationen des Geschäftsobjekts an die Datenschicht und die Datenschicht prüft diesen Typ und entscheidet, wo die Daten platziert werden sollen.
Ist es die richtige Lösung, um Datenschicht inspizieren eingehende Daten und bestimmt seinen Platz oder sollte Datenschicht expose Liste der "Orte", wo Daten gespeichert werden können (enum?)?
Vielen Dank im Voraus!
/Klarstellung :
Die Optionen, die ich hier sehe, sind: 1. Datenebene bietet eine Liste von "Plätzen", auf denen Daten gespeichert werden können 2. Die Datenebene prüft die gegebenen Argumente (wie den Typ arg) und bestimmt, wo die Daten gespeichert werden
Erste Option: Was passiert, wenn ich versuche, ein Geschäftsobjekt vom Typ "Produkt" in einer Struktur zu speichern, die normalerweise vom Typ "Benutzer" verwendet wird?
Zweite Option Strafe; Ich muss den Typ "Namespace1.Namespace2.User" einer bestimmten Routine zuordnen, die ihre Daten in der Tabelle "User" speichert. Also manuell tun einige Zuordnung für JEDEN Typ...
/Klarstellung 2:
Jetzt rufe ich sie auf diese Weise ab:
service.Retrieve(typeof(Catalog), null, catalogArgs, e => catalogConverter.Read(e));
Ich übergebe also typeof(Catalog) an die Datenschicht... so habe ich Typinformationen in der Datenschicht.
Jetzt in der Datenschicht muss ich "Adapter" auswählen, die harte Arbeit, um Daten aus der Datenbank zu erhalten tut. Ich kann eine enorme if/switch-Struktur schreiben, um den Adapter auszuwählen ... was frustrierend ist. Ich kann auch ein Attribut schreiben und es wie folgt verwenden:
[TypeAdapterAttribute("Namespace1.Namespace2.Catalog, and assembly info...")]
class CatalogAdapter { ... }
Dann habe ich Code, der Mapping von gegebenen Typ zu Attributwert tut...
...aber es ist ein wenig aufgebläht und problematisch mit diesem hart kodierten Typ String...
Irgendwelche Vorschläge...?
/Klarstellung 3
Ich habe die Idee, dass dieses System durch "steckbare Geschäftsmodule" erweitert werden kann. Diese Module enthalten Geschäftsobjekte (und einige Logik), die von der Basis-Geschäftslogik nicht bekannt sind, und auch die Datenschicht weiß nichts von diesen Geschäftsobjekten, die in "gesteckten Baugruppen" enthalten sind. Dieses externe Geschäftsmodul hat keinen Bezug zur Basis-Business-Schicht oder zur Datenschicht. Wenn ein Geschäftsobjekt aus dieser externen Baugruppe gespeichert wird (=an die Datenschicht gesendet wird), speichert die Datenschicht es standardmäßig automatisch in einer Datenstruktur im EAV-Stil (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value\_model). Da diese Art von Datenstruktur zu Leistungsproblemen führen kann, muss die Datenschicht die Möglichkeit haben, bestimmte Geschäftsobjekttypen in einer eigenen Datenstruktur zu speichern (normalerweise eine Tabelle mit einer Eins-zu-Eins-Zuordnung zu diesem Typ). Hier stellt sich also das Problem, wie man diese "Auswahlentscheidung" implementiert :)
Die Idee ist, dass ich viele neue Geschäftsobjekte erstellen und alle in der Datenschicht speichern kann, ohne etwas in der Datenschicht zu codieren! Zu einem späteren Zeitpunkt kann ich bei Bedarf eigene Datenstrukturen für ausgewählte Geschäftsobjekte erstellen.