Ich habe ernsthafte Zweifel am Design meiner Webanwendung.
Ich wollte die Geschäftslogik von der Schnittstelle trennen, also habe ich eine Web-API erstellt, die alle Anforderungen an die Datenbank verarbeitet.
Es ist eine ASP.NET-Web-API mit Entity-Framework und einer Arbeitseinheit sowie einem generischen Repository-Muster. Bisher ist alles gut.
PROBLEM
Wenn ich Hilfe benötige, kann ich keine effiziente Methode zum Freigeben von Objekten zwischen der API und der Anwendung finden.
Ich möchte das Entitätsobjekt nicht direkt serialisieren. Ich dachte, es wäre eine schlechte Praxis, denn wenn sich das Entitätsmodell ändert, könnte ich ohne Grund große Objekte serialisieren.
Wie es jetzt implementiert ist
Da meine Schnittstelle eine ASP.NET-Webanwendung in C # und meine API in C # ist, habe ich eine gemeinsame Bibliothek mit der Definition aller meiner Klassen erstellt, die ich zwischen ihnen teilen möchte.
Ich weiß, dass die Lösung nicht funktioniert, wenn ich eine Android-App entwickle. Ich muss meine Klassen erneut in Java erstellen, aber das ist nicht mein größtes Problem.
Das Problem ist, dass ich das Gefühl habe, meine Objekte immer zu konvertieren.
BEISPIEL
Hier ist ein Beispiel für meinen Arbeitsablauf:
Ich beginne mit einem Modell mit allen Objekten und den Datenanmerkungen für mein Formular, dann würde der Benutzer dieses Modell an einen Controller senden.
Im Controller muss ich dieses Modell in eine Klasse in meiner gemeinsamen Bibliothek konvertieren und dieses Objekt dann an meine API senden.
Dann fängt ein Controller in meiner API den Aufruf ab und konvertiert dieses Objekt in ein Entitätsobjekt, um die Datenbank zu aktualisieren.
Ich habe also 3 Klassen
- Das Modell für die Ansicht mit allen Datenanmerkungen für die Validierung (Client)
- Die allgemeinen Bibliotheksklassen zum Freigeben der Objekte (DLL)
- Die Entitätsklassen (API)
Ich habe das Gefühl, dass ich etwas wirklich falsch mache. Gibt es etwas eleganteres? Ich möchte sicherstellen, dass ich eine gute Lösung für dieses Problem habe, bevor das Projekt zu groß wird.
Antworten:
Ich weiß, es scheint, als würden Sie ständig Objekte zwischen Ihren Datenbankobjekten, Ihren Datenübertragungsobjekten, Ihren Clientobjekten mit Validierungslogik usw. hin und her konvertieren, aber ich würde sagen, nein, Sie machen nichts falsch .
Jedes dieser Objekte kann dieselbe Informationseinheit darstellen, hat jedoch sehr unterschiedliche Verantwortlichkeiten. Das Datenbankobjekt ist Ihre Kommunikationsschnittstelle mit der Datenbank und sollte in der Datenbankebene aufbewahrt werden, da es möglicherweise unterschiedliche Anmerkungen zu Datenbankmetadaten und / oder unnötige Details zur Datenbankimplementierung enthält.
Ihr Datenübertragungsobjekt ist die Kommunikationsschnittstelle mit Ihren API-Verbrauchern. Diese sollten so sauber wie möglich sein, um einen einfachen Verbrauch aus verschiedenen Sprachen / Plattformen zu ermöglichen. Dies kann bestimmte Einschränkungen für das Aussehen und Verhalten dieser APIs mit sich bringen, je nachdem, welche API-Konsumenten Sie unterstützen möchten.
Ihre Client-Objekte mit Validierungslogik sind nicht Teil Ihres API-Projekts, sondern Teil Ihres Consumer-Projekts. Diese können in diesem Fall nicht mit den Datenübertragungsobjekten identisch sein, da Sie ihnen zusätzliche clientspezifische Logik (in diesem Fall Validierungsattribute) hinzufügen, von der der Server nichts weiß (und von der er nichts wissen sollte!). Sie sollten dies nicht tun Zählen Sie diese Objekte als Teil Ihrer API, da dies wirklich nicht der Fall ist. Sie sind sehr konsumentenspezifisch und einige Anwendungen, die Ihre API verwenden, müssen diese Objekte möglicherweise nicht einmal erstellen und können genauso gut nur mit Ihren Datenübertragungsobjekten überleben. Wenn Sie beispielsweise keine Validierung benötigen, benötigen Sie keine zusätzliche Objektebene, die vollständig mit Ihren Datenübertragungsobjekten identisch ist.
Mir scheint, dass jeder der drei Objekttypen sehr gut einer einzigen Verantwortung zugeordnet ist, die aus sauberer Codierung und bewährten Verfahren besteht. Leider bedeutet sauberer Code und bewährte Methoden manchmal, dass Sie viel zusätzlichen Code schreiben und "nur weil" durch zusätzliche Rahmen springen. Und während des Codierens kann es schwierig sein, den Wert zu schätzen, den dies für Sie bietet. Sobald Sie jedoch Ihre Anwendung freigeben und sie unterstützen oder neue Funktionen für die nächste Version hinzufügen, werden Sie wahrscheinlich zu schätzen wissen, dass Sie sich die Zeit dafür genommen haben Trennen Sie diese Bedenken in erster Linie richtig. (Ganz zu schweigen davon, dass Sie '
Ich hasse es auch, Konvertierungscode zwischen verschiedenen Objekttypen wie diesem zu schreiben, aber meine Lösung ist normalerweise eine der folgenden:
quelle