C# : Also wenn eine statische Klasse ist eine schlechte Praxis für die Speicherung von globalen Zustand info, was ist eine gute alternative, die bietet den gleichen Komfort?
Habe ich schon bemerkt statische Klassen immer eine Menge von schlechten rep auf, SO dass in Bezug auf die zum speichern der globalen Informationen. (Und globalen Variablen wird verschmäht im Allgemeinen) möchte ich nur wissen, was eine gute alternative für mein Beispiel unten...
Ich entwickle eine WPF-Anwendung, und es hat viele Ansichten auf die Daten aus meiner db gefiltert werden basierend auf der ID des aktuell angemeldeten Benutzers. Ebenso werden bestimmte Punkte in meiner app sollte nur zugänglich für Benutzer, die als 'admins'.
Ich bin derzeit die Speicherung einer loggedInUserId und ein isAdmin bool in einer statischen Klasse.
Verschiedenen Teile meiner app benötigen diese info, und ich Frage mich, warum es nicht ideal, in diesem Fall, und was die alternativen sind. Es scheint sehr komfortablen Einrichtung und Ausführung zu erhalten.
Das einzige, was ich denken kann als eine alternative ist der Einsatz eines IoC-Container injizieren eine Singleton-Instanz in Klassen, die Notwendigkeit dieser globalen Informationen, die Klassen könnten dann sprechen Sie dies durch die Schnittstelle. Jedoch ist diese übertrieben /führt mich in Analyse-Paralyse?
Dank im Voraus für jede Einsicht.
Update
So, ich bin Neigung in Richtung dependency injection via IoC, wie wäre Es eignet sich besser, um die Testbarkeit, da ich swap in einem Dienst, der eine "Globale" info " mit einem Modell, wenn nötig. Ich nehme an, was bleibt, ist, ob oder nicht das injizierte Objekt sollte ein singleton oder statische. 🙂
Wird prob pick Mark ' s Antwort zwar warten, um zu sehen, ob es irgendeine weitere Diskussion. Ich glaube nicht, dass es einen richtigen Weg als solchen. Ich bin nur daran interessiert zu sehen, einige der Diskussion, die würde mich aufklären, wie es zu sein scheint, eine Menge von "das ist schlecht" "das ist schlecht" - Aussagen auf einige ähnliche Fragen, ohne Konstruktive alternativen.
Update #2
Also suchte ich Robert ' s Antwort sehen, wie es ist, eine gute alternative (ich vermute, die alternative ist ein komisches Wort, wahrscheinlich der Wahre Weg, zu sehen, wie es gebaut ist, in den Rahmen). Es ist nicht zwingen, mir das erstellen einer statischen Klasse/singleton (obwohl es ist thread-statisch).
Die einzige Sache, die macht mich immer noch neugierig ist, wie dieser gewesen wäre, angegangen wird, wenn die "globalen" Daten, die ich hatte, um zu speichern, hatte nichts zu tun mit Benutzer-Authentifizierung.
- Ich denke, dass die globalen Daten ist in Ordnung in diesem Fall. Kann es geändert werden überall in Ihrer Anwendung, oder kann es nur in einem Ort? Letzteres wäre besser, wenn möglich. Manchmal braucht man einfach nur die globalen Daten, und es macht keinen Sinn zu haben, es auf andere Weise. Menschen neigen dazu, religiöse Zeug dazu.
- Regeln werden aufgestellt, um gebrochen zu werden. ASP.NET bietet statische Orte, um Daten zu speichern, zum Beispiel.
- Diese Eigenschaften werden festgelegt, nachdem ich meine login-Bildschirm, wenn es ausführt, die überprüfung der Benutzer in der DB
- Es ist keine Analyse-Paralyse, wenn Sie es einfach tun 🙂
- in meiner situation kann es nur einen Benutzer angemeldet, da es eine WPF-client-app.
- Wenn es nur wenige Orte, um zu injizieren, dann nutzen Sie DI. Mein Antwort war basiert auf Sie müssen die Informationen in der gesamten Anwendung. Wenn nicht, dann nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vergessen Singletons und statische Daten. Das Muster der Zugang ist zu Versagen, Sie auf einige Zeit.
Erstellen Sie Ihre eigenen benutzerdefinierten IPrincipal-und ersetzen-Thread.CurrentPrincipal mit ihm an einem Punkt, wo login angemessen ist. Sie in der Regel halten die Referenz auf die aktuelle IIdentity.
In Ihrer routine, wo sich der Benutzer anmeldet, z.B. weil Sie Ihre Anmeldeinformationen überprüft haben, fügen Sie Ihre benutzerdefinierten principal zu dem Thread.
in ASP.Net Sie würde auch die
HttpContext.Current.User
gleichzeitigDies ist die bevorzugte Weise, es zu tun, und es ist im Rahmen für einen Grund. Auf diese Weise können Sie an die Benutzer in einem standard-Weg.
Tun wir auch Dinge wie das hinzufügen von Eigenschaften, wenn der Benutzer anonym (unbekannt) zu unterstützen, ein Szenario mixed anonym/logged-in-Authentifizierung Szenarien.
Zusätzlich:
Gibt es noch viele andere Antworten hier auf, SO dass erklärt, warum die Statik (einschließlich Singleton) ist schlecht für Sie, also ich werde nicht ins Detail gehen (obwohl ich von ganzem Herzen Sekunde diese Gefühle).
Als eine Allgemeine Regel, DI ist der Weg zu gehen. Sie können dann Spritzen, ein service, der Ihnen sagen kann, was Sie benötigen, um wissen über die Umwelt.
Aber, da Sie den Umgang mit Benutzer-Informationen-Thread.CurrentPrincipal kann eine brauchbare alternative (obwohl es ist Thread Statisch).
Für die Bequemlichkeit, können Sie wickeln Sie ein stark typisiertes User-Klasse um ihn herum.
Ich würde versuchen einen anderen Ansatz. Die statischen Daten der Klasse wird Sie in Schwierigkeiten bringen-das ist aus Erfahrung. Sie hätte ein Benutzer-Objekt (siehe @Robert Paulson ' s Antwort für eine gute Möglichkeit, dies zu tun) und übergeben Sie die zu jedem Objekt, wie Sie es konstruieren-es könnte für Sie arbeiten, aber Sie bekommen eine Menge template-code, die nur wiederholt überall.
Könnten Sie speichern Sie alle Ihre Objekte in eine Datenbank /verschlüsselte Datei mit den erforderlichen Berechtigungen und dann dynamisch geladen, alle von Ihnen auf der Grundlage Ihrer Benutzer-Berechtigungen. Mit einem einfachen admin-Formular auf der Datenbank, es ist ziemlich leicht zu pflegen (die Datei ist ein bisschen schwieriger).
Könnten Sie eine RequiresAdminPermissionAttribute Objekt für alle Ihre empfindliche Gegenstände, und überprüfen Sie es auf run-time-gegen Ihre Benutzer-Objekt bedingt zu laden, auf Objekte.
Während die route Sie sind auf den Verdienst, ich denke, es gibt einige bessere Möglichkeiten, um zu versuchen.