Gå til innhold

C#: Mellomlagre et objekt i en sesjon variabel


Anbefalte innlegg

Heisan folkens

 

WEB appen min har en del klasse og jeg liker klasser som tar vare på seg selv slik at jeg i programmet mitt ikek trenger tenke mer på dette. Derfor tenkte jeg i min uvitenhet at jeg kunne benytte constructoren til å få til dette, men akk: Følgende kode er prøvd uten hell:

public class SomeClass : System:Web.UI.Page
{
 public string SomeProperty;
 private int SomePrivateProperty;

 public SomeClass(string SessionID)
 {
RestoreState(SessionID);
 }

 private void RestoreState(string SessionID)
 {
this = (SomeClass)Session[SessionID];
 }

 public void SaveState(string SessionID)
 {
Session.Remove(SessionID);
Session(SessionID) = this;
 }

}

Dette kompillerer ikke fordi THIS er ReadOnly, og jeg har selvsagt full forståelse for dette. Men finnes det en annen måte å gjøre dette enkelt på? Jeg kan jo selvsagt ta bryet og utvide SaveState med å lagre alle variablene jeg trenger, men vedlikeholdet på dette er jo håpløst.

Lenke til kommentar
Videoannonse
Annonse

Å lagre hele siden (med kontroller og alt mulig) i Session blir bare tøys. Bruk heller eksempelet mitt fra igår, eller gjør sånn som dette:

internal class MyState
{
 private MyState() //private slik at den ikke får lages utenifra.
 {}

 // En haug med properties her (private field + internal property).
// ....

internal void SaveState()
{
	 HttpContext.Current.Session["MyState"] = this;
}

internal static MyState GetState
{
	 get
	{
		   return (HttpContext.Current.Session["MyState"] as MyState) ?? new MyState();
	}
}
}

Lenke til kommentar
Å lagre hele siden (med kontroller og alt mulig) i Session blir bare tøys. Bruk heller eksempelet mitt fra igår, eller gjør sånn som dette:

internal class MyState
{
 private MyState() //private slik at den ikke får lages utenifra.
 {}

 // En haug med properties her (private field + internal property).
// ....

internal void SaveState()
{
	 HttpContext.Current.Session["MyState"] = this;
}

internal static MyState GetState
{
	 get
	{
		   return (HttpContext.Current.Session["MyState"] as MyState) ?? new MyState();
	}
}
}

 

OJ!! Return(HttpContext............ as MyState) ?? new MyState(); var ny for meg. Hva gjør denne egentlig? Hvis jeg skal gjette så henter den ut en session var, caster den til MyState, oppretter en ny instans av MyState og lagrer den castede instansen i den nye instansen. Noe slik?

Lenke til kommentar

?? er en kjekk operator. Den returnerer den første av operandene som ikke er null.

 

(HttpContext.Current.Session["MyState"] as MyState) prøver å caste til MyState, men som du kanskje vet så er as en sikker cast, den returnerer null hvis objektet ikke er av riktig type.

 

Dermed vil HttpContext.Current.Session["MyState"] ?? new MyState() returnere enten objektet i sesjonen, eller hvis objektet er null eller ikke av riktig type et nytt objekt av MyState (new MyState).

Lenke til kommentar
?? er en kjekk operator. Den returnerer den første av operandene som ikke er null.

 

(HttpContext.Current.Session["MyState"] as MyState) prøver å caste til MyState, men som du kanskje vet så er as en sikker cast, den returnerer null hvis objektet ikke er av riktig type.

 

Dermed vil HttpContext.Current.Session["MyState"] ?? new MyState() returnere enten objektet i sesjonen, eller hvis objektet er null eller ikke av riktig type et nytt objekt av MyState (new MyState).

Glimrende. Det betyr at dette egentlig er omtrendlig det samme som dette:

MyState m = new Mystate;
try
{
 m = (MyState)Session["MyState"];
}
catch
{}
return m;

Lenke til kommentar
MyState m = new Mystate;
try
{
 m = (MyState)Session["MyState"];
}
catch
{}
return m;

 

Nja, egentlig betyr det:

if( Session["MyState"] != null && Session["MyState"] is MyState )
return (MyState)Session["MyState"];
else
  return new MyState();

 

Unngå bruk av try/catch hvis du kan gjør det på en bedre måte ;)

Lenke til kommentar
MyState m = new Mystate;
try
{
 m = (MyState)Session["MyState"];
}
catch
{}
return m;

 

Nja, egentlig betyr det:

if( Session["MyState"] != null && Session["MyState"] is MyState )
return (MyState)Session["MyState"];
else
  return new MyState();

 

Unngå bruk av try/catch hvis du kan gjør det på en bedre måte ;)

Tøfft. Kjennte ikke til IS.

 

Takker for alle tips

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...