2012-04-09 3 views
0

Ich habe derzeit einen Typ, den ich in meine Controller injiziere, der zum Abrufen und Einstellen von Sitzungsdaten verwendet wird.Beseitigung statischer Eigenschaften - Welche Muster habe ich zur Verfügung?

Ich verwende dies, damit ich relevante Sitzungsinformationen wie _sessionData.Username statt Session["username"] erhalten kann.

Ich möchte diese Sitzungsinformationen in allen meinen Ansichten verwenden und hätte dies zuvor getan, indem ich die SessionData-Mitglieder statisch gemacht habe, anstatt die SessionData-Klasse in meinen Controller zu injizieren.

Ich möchte vermeiden, statische Mitglieder zu verwenden sowie das Objekt an die Ansicht in jedem Controller übergeben.

Welche Muster passen am besten zu dieser Art von Szenario? Was tun Sie, um das gleiche Problem zu lösen?

Antwort

0

Warum nicht einfach Session ["Benutzername"] verwenden? Sie können den statischen Aufruf in einer Instanz wie folgt wickeln:

public class MySessionClass 
{ 
    public string GetSessionValue(String value) 
    { 
     return Session[value]; 
    } 
} 

gewinnen Sie die Wartung und Flexibilität einer Instanz, die dann in einem Test verspottet werden kann, ohne wieder die Session-Klasse neu zu schreiben über

UPDATE

Was hindert Sie daran, einen Code-Block zu schreiben und neu zu schreiben und ihn zu benutzen, soweit Sie Ihre Instanz in Ihrer Sicht verwenden? Sie sollten in der Lage sein, Code wie alle anderen Code-Nuggets in MVC zu schreiben. Aber, ich würde vorschlagen, dies zu tun, da es den Zweck der Tiering Ihre Architektur besiegt. Sie können entweder direkt auf die Sitzung zugreifen, wie Sie es mit einer HTML-Seite tun würden, oder Sie können sie als Objekt von Ihrem Controller übergeben.

+0

Ich bevorzuge es, genau zu wissen, auf was ich in der Sitzung zugreifen kann, anstatt magische Schlüsselzeichenfolgen zu verwenden. Meine SessionData-Klasse macht ziemlich genau das, was Ihre Methode oben tut. Die Frage ist, wie verwende ich das in meinen Ansichten, ohne es statisch zu machen? –

+0

@JamieDixon Entschuldigung, das habe ich verpasst und meine Antwort aktualisiert. –

+0

Danke Justin. Bis jetzt scheint keine der Lösungen, die ich kenne, sehr elegant zu sein. Zugreifen auf statische Klassenmitglieder mithilfe von Magic Strings, um direkt auf das Sitzungsobjekt zuzugreifen und neue Objekte in der Ansicht zu erstellen. Es muss eine elegantere Möglichkeit geben, auf geteilte Informationen in einer Vielzahl von Ansichten zuzugreifen.Vielleicht mit einem Basis-Controller, um die benutzerdefinierte Session-Klasse für jede Anfrage in den View-Bag einzufügen. –

0

Dependency-Injektion würde Ihnen hier helfen. Nehmen Sie ein Abhängigkeits-Injection-Framework und integrieren Sie es in Ihre MVC-Anwendung. Um beispielsweise Ninject in Ihre MVC-Anwendung zu integrieren, siehe blog post.

Sobald Sie ein DI-Framework mit Ihrer Anwendung integrieren. Registrieren Sie die SessionData-Klasse mit dem DI-Framework. Wählen Sie basierend auf Ihrem Szenario eine gültige Lebensdauer für die SessionData-Klasse aus. Wenn Sie sich diese DI-Frameworks ansehen, stellen Sie mehrere lebenslange Konfigurationen bereit, z. B. Instanz pro Aufruf, pro Sitzung, Singleton.

Jetzt injiziere SessionData Abhängigkeit wo immer Sie wollen. Für Regler können Sie eine Base enthält diese Abhängigkeit als öffentliches Eigentum wie

[Inject] 
public SessionData SessionContext {get;set;} 

für Ansicht Teil Sie vorbei strongly typed model suchen müssen erstellen. Der Prozess wäre hier ähnlich. Erstellen Sie ein BaseModel, behalten Sie eine SessionData-Eigenschaft hier bei, und DI-Framework sollte den Rest erledigen. Der letzte Schritt wäre, dieses Modell an jede gerenderte Ansicht zu übergeben.

+0

Bitte sehen Sie meine Antwort und die Kommentare, das ist was bereits vorgeschlagen wurde und der OP ist unzufrieden damit. –

+0

Danke @Chandermani. Ich benutze bereits die Abhängigkeitsinjektion, und wie Justin bereits sagte, behandelte er die meisten bekannten Möglichkeiten, die Daten an die Ansicht zu übergeben. Sehen Sie meine Kommentare zu seiner Antwort, wenn Sie weitere Informationen wünschen. Meine Frage war wahrscheinlich etwas unklar. –

Verwandte Themen