Frage

In meinem ASP.NET-Anwendung mit InProc Sitzungen, ruft Session_End eine statische Methode in einem anderen Objekt sitzungsspezifische Sanierung zu tun. Diese Sanierung verwendet eine gemeinsame Datenbank-Verbindung, die ich in Anwendungszustand bin zu speichern.

Das Problem ist, dass ich nicht sehen kann, wie die Anwendung Zustand zugreifen, ohne sie (oder besser gesagt die Datenbankverbindung) als Parameter an die sauberen up-Methode übergeben. Da ich in einer Anfrage bin nicht habe ich keine aktuellen Httpcontext, und ich kann keine andere statische Methode finden, um den Zustand zugreifen.

Bin ich etwas fehlt?

UPDATE : Es scheint, dass meine Frage weitere Klärung bedarf, so lassen Sie mich das folgende Codebeispiel versuchen. Was ich tun möchte, der Lage sein:

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp();
}

Aber das Problem ist, dass die CleanUp Methode wiederum braucht Informationen, die in Anwendungsstatus gespeichert wird. Ich tue bereits die folgenden, aber es ist genau das, was ich hatte gehofft, zu vermeiden; das ist, was ich gemeint „... ohne es vorbei ... als Parameter für die saubere up-Methode“ weiter oben.

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp(this.Application);
}

Ich mag es einfach nicht die Idee, dass Global.asax hat wissen, wo das NeedsCleanup Objekt seine Informationen bekommt. Diese Art von Dingen, die in der Klasse mehr Sinn als in sich geschlossene macht.

War es hilfreich?

Lösung

Wo erstellen Sie die „NeedsCleanup“ Instanzen? Wenn es in Session_Start ist, macht es Sinn, dass Ihre globale Klasse würde wissen, wie / wann sowohl erstellen und diese Instanz zerstören.

Ich verstehe Sie mögen, dass die Bereinigung von NeedsCleanup von seinem Anrufer entkoppeln. Vielleicht ist ein sauberer Weg in der „Httpapplication“ Instanz sowohl auf „HttpContext.Current.ApplicationInstance“ sowie aus dem globalen Klasse über die „diese“ Referenz gefunden passieren würde. Alternativ können Sie auch eine der oben genannten Beispiel auf dem Bau angeben, dass eine Marke Bereinigungs weniger gekoppelt würde.

Andere Tipps

Sie sollten das ApplicationState Objekt mit Hilfe der Application-Eigenschaft von innen Session_End zugreifen können.

void Session_End(object sender, EventArgs e) 
{
     HttpApplicationState state = this.Application;
}

(hatte in einer anderen Antwort zu antworten, weil ich den Ruf nicht benötigt, um direkt zu kommentieren)

Sie sollten das Session Objekt mit der Session-Eigenschaft von innen Session_End zugreifen können.

void Session_End(object sender, EventArgs e) 
{
    HttpSessionState session = this.Session;
}

Diese Eigenschaft und viel mehr kommen von der Basisklasse von Global.asax

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top