Ich entwerfe eine neue Anwendung, die sich mit viel Geschäftslogik befasst.
Um die übliche Verstrickung zwischen verschiedenen Anwendungsebenen zu vermeiden, die sich im Laufe der Zeit häufig in solche Systeme einschleicht, möchte ich von Anfang an eine saubere Trennung von Bedenken implementieren. Im Großen und Ganzen möchte ich trennen:
- Präsentationsfolie
- Geschäftslogikschicht
- Datenspeicherungs- und Persistenzschicht
Die Frage, mit der ich am meisten zu kämpfen habe, ist, wie das Verhalten an den Rändern tatsächlich sauber implementiert werden kann, insbesondere zwischen dem Unternehmen und der Datenschicht. Ich habe zu viele Anwendungen gesehen, bei denen die Datenschicht ORM-Objekte an die Kernschicht übergibt und die Geschäftslogik effektiv eng mit dem ORM verknüpft.
Sollte ich ORM-Objekte in ein serialisiertes Format (JSON?) Konvertieren und dieses dann in der Geschäftsschicht in eine Datenstruktur innerhalb dieser Schicht deserialisieren? Ist das nicht viel Aufwand?
Wie implementieren Sie die Trennung von Bedenken für mittelgroße Anwendungen sauber? Irgendein Rat?
article.getId()
,article.getTimestamp()
usw. Diese Zuordnungen scheinen häufiger als nicht spezifisch für die ORM sein verwendet.Antworten:
Es gibt immer eine logische Kopplung zwischen Geschäftslogik und Datenbank. Ihre Bemühungen sollten sich darauf konzentrieren, eine physikalische Kopplung zu verhindern.
Nehmen Sie zum Beispiel die grundlegende Geschäftsregel, dass jeder Benutzer eine eindeutige Benutzer-ID haben muss. Sie können versuchen, diese Regel in der Geschäftsschicht durchzusetzen, aber es wird immer ein Szenario geben, in dem mehrere Benutzer gleichzeitig dieselbe Benutzer-ID versuchen können, und der einzige Ort, an dem Sie die Eindeutigkeit überprüfen und eine Benutzer-ID in einem reservieren können atomarer Weg ist in der Datenbank.
Jetzt sollte die Geschäftsschicht nicht mehr den Namen der Tabelle oder der Spalte kennen müssen oder sogar, dass Benutzer in einer Datenbank gespeichert sind (sie könnten beispielsweise stattdessen in Active Directory für eine Intranetanwendung gespeichert werden). Das sollte nur die Datenzugriffsschicht wissen. Aber eine Menge Aufwand zu betreiben, um das Schema von den Geschäftsregeln zu trennen, ist wahrscheinlich verschwendeter Aufwand.
quelle
Stellen Sie sicher, dass sich Ihre Geschäftsmodellobjekte in ihrer eigenen Bibliothek befinden, die keine ORM- oder Datenbankclients referenziert.
Verwenden Sie das Repository-Muster und verweisen Sie nur auf Schnittstellen zu den Repositorys in Ihrem Hauptcode.
Verfügen Sie über eine vollständig separate konkrete Repository-Bibliothek, die für die Datenschicht spezifisch ist und auf die Schnittstellenbibliothek, die Geschäftsmodellbibliothek und den Datenbankclient verweist.
quelle