Wir haben eine dreischichtige Anwendung, bei der jeder Anruf von der Service-Schicht zur Business-Schicht geht und per Datenschicht weiterverarbeitet wird. Komponenten jeder Ebene können nur die darunter liegende Ebene aufrufen.
Aber weil wir Hunderte von Entitäten haben und wir viele Dienste im Zusammenhang mit Crud-Operationen haben, sind so viele Konflikte in unserem Team aufgetreten.
Einige glauben, aus Gründen der Wartung und der einfachen Entwicklung ist es besser, den Datenzugriff von Crud-Diensten aufzurufen, die nur die Crud-Operation durchführen und die Business-Schicht umgehen.
Im Gegensatz dazu müssen wir sagen, dass wir einen Wrapper für den Datenzugriff jeder Entität in der Business-Schicht erstellen und diese Wrapper von Diensten aufrufen müssen und niemals zulassen, dass Dienste die Datenzugriffsschicht aufrufen.
In Ihrer Idee, welchen Weg wir nehmen sollten? Ist es in Ordnung für Crud-Dienste, Datenzugriffe aufzurufen und Business-Layer zu umgehen?
Wenn keine Geschäftslogik ausgeführt werden soll, gibt es keinen Grund, eine Business-Schicht zu erzwingen. Die 3-Tier-Architektur ist kein arkanes Protokoll, sondern lediglich eine Best Practice, die unter der Annahme einer Geschäftsverarbeitung gebildet wurde.
In einer aktuellen Anwendung greifen wir häufig direkt von JSF-Controllern auf DAOs zu, wenn kein Geschäftsprozess involviert ist. Die Idee wurde von einem Java-Champion gegeben, der die Idee betonte, dass Einfachheit im Vordergrund steht.
Wenn Sie über zukünftige Änderungen besorgt sind, die möglicherweise eine Geschäftslogik erfordern. Ich denke an das Problem auf diese Weise: Die zusätzliche Geschäftslogik würde ohnehin der Business-Schicht hinzugefügt, einschließlich des Datenzugriffs, so dass hier kein Unterschied besteht.
CRUD-Code ist meistens sehr einfach. Die Änderung des Dienstes würde also bedeuten, einen einzelnen Aufruf oder einige Aufrufe des DAO an ein EJB umzuleiten - ein einfaches Refactoring. Der CRUD-Code selbst würde immer noch bestehen bleiben, aber in das EJB geschoben werden - ein weiteres einfaches Refactoring.
Das ist nicht perfekt, aber IMO besser als die Alternative: eine leere Indirektionsschicht haben. Dies fügt eine Komplexität hinzu, die keinen Zweck erfüllt. Das Geschäftsobjekt würde nur die Aufrufe an das DAO weiterleiten.
Es gibt zwei Code-Gerüche , die ich in diesem Fall anwenden kann: künstliche Komplexität und Funktionsneid .
Ich sage nicht, dass DA in der Business-Schicht irgendwie ein Code-Geruch ist. Was ich meine ist, dass ein Geschäftsobjekt, das nichts anderes macht als das DAO, ein Geruch ist. Das gleiche gilt für die Komplexität - eine zusätzliche Datenstruktur / Architekturschicht, die keinen eigenen Zweck erfüllt - es scheint bereits eine DAL in Ihrer Anwendung zu sein.
Ein weiterer zu berücksichtigender Aspekt wäre - wie überraschend ist es für einen Entwickler, einen Dienst zu sehen, der direkt ein DAO verwendet? 5 Dienste, von denen 2 direkt auf DAO zugreifen, unterscheiden sich von 100 Diensten, bei denen nur ein Dienst direkt auf die DAOs zugreift.
Im ersten Fall würde die Code-Einfachheit die hinzugefügte konzeptionelle Komplexität überwiegen (2 Konzepte für eine einzelne Sache), im zweiten Fall würde ich eher bei der Business-Ebene bleiben - der Überraschung (auch WTF-Effekt genannt); es nur einmal zu tun, wäre zu groß.
Meiner Meinung nach wird der Aufruf der CRUD-Dienste, die die Business-Schicht umgehen, dazu führen, dass die aktuelle Service-Schicht in eine Business-Schicht umgewandelt wird, wenn Sie die Funktionalität erhöhen. Ihre Dienstschicht wird also auch als Business-Schicht fungieren, wenn Sie damit einverstanden sind.
In den meisten Fällen handelt es sich um eine Entität, die wahrscheinlich viele Datenschicht-Crud-Aufrufe beinhalten kann, beispielsweise bei einem Update. Eine Business-Schicht wird für diesen Zweck empfohlen. Und Business-Layer ist der Ort, um Geschäftsregeln auszuführen, Caching durchzuführen oder andere Geschäftsdienste aufzurufen, wenn dies erforderlich ist. Dies wird die obere Ebene einfach halten und durchlaufen.
Ich werde die Business-Schicht nicht umgehen. Obwohl es so aussieht, als ob Sie nur den Aufruf für die DAL in die BL übernehmen, und obwohl dies ein Fall einer sehr einfachen CRUD-Operation sein kann, kann die BL die für die Operation erforderliche Validierungslogik einkapseln. Die Validierungslogik kann auf der BL durchgeführt werden, und die Proxysierung auf DAL wird nur durchgeführt, wenn die Validierungsbedingungen erfüllt sind.
Wenn Sie nur CRUD-Vorgänge haben, können Sie Data Services verwenden, um Ihre Datensätze als Web-Services zu veröffentlichen. Ein gutes Beispiel hierfür ist WSO2 Data Services Ссылка
Tags und Links java-ee architecture design web-services