In einer gewöhnlichen MVC-entworfenen Anwendung ist es eine schlechte Idee, die Servic-Ebene von einer Benutzersitzung abhängig zu machen? Angenommen, es gibt eine Service-Methode, die ein paar Objekte aus einer Datenbank abruft, und Sie möchten unterschiedliche Ergebnisse zurückgeben, abhängig davon, wer den Aufruf initialisiert - zum Beispiel könnte ein Administrator 10 Zeilen von Objekten erhalten, während ein normaler Benutzer möglicherweise nur 7 Zeilen erhält, weil die letzten 3 "nur für Administratoren" sind. Ein paar Möglichkeiten, dies zu lösen, wären:
- Einführung eines neuen Methodenparameters, in dem Sie den aufrufenden Benutzer einschließen. Abhängigkeitslos, aber umständlich, den Benutzerparameter in vielen Methoden einfügen zu müssen.
- Erstellen Sie verschiedene Methoden für verschiedene Benutzerrollen (mit mehreren Ergebnissen). Auch abhängigkeitslos, aber viele Methoden, die im Grunde dasselbe tun, was das Risiko von Code-Duplizierung erhöht.
- Lassen Sie die Methode aus einem ThreadLocal-Variablen in einem statischen Kontext lesen, die die aktuelle Benutzersitzung speichert. Diese Variable wird vor jedem Aufruf festgelegt.
In letzter Zeit habe ich die letzte Methode immer öfter verwendet, da sie eine saubere Schnittstelle bietet und sich sehr praktisch zu verwenden anfühlt. Ein Filter stellt sicher, dass der aktuelle Thread immer einen Benutzer hat. Ist das schlechtes Design? Ich glaube, dass einige dies als eine Abhängigkeit der Service-Ebene von der Web-Ebene betrachten könnten, obwohl ich persönlich denke, dass sie ziemlich entkoppelt sind. Die größte Konsequenz ist, dass das Verhalten einer Methode je nach Zustand einer anderen Klasse unterschiedlich sein wird, was sowohl positiv als auch negativ sein könnte.
Was denkst du darüber? Wenn es keine gute Lösung ist, was wäre eine stärkere?