Gå til innhold

Lagring av enkeltvariabler i applikasjon


Anbefalte innlegg

Jeg lager en webapplikasjon med ASP.NET/C#, og lurer på hva som er den beste måten å lagre enkeltvariabler/-konstanter på. Jeg snakker om frittstående og permanente applikasjonsvariabler med et navn (key) forbundet en verdi, f.eks. EnEllerAnnenMaksimumsVerdi = 200. Disse skal kunne forandres av admins via en webside når dette er nødvendig. Jeg kunne ha lagt de inn som keys i web.config, men dette føles ikke helt naturlig. En databasetabell med to tekstkolonner virker heller ikke så solid. Noen tips?

Lenke til kommentar
Videoannonse
Annonse

Ingen god idè å putte dette i web.config nei. Hver gang web.config endres så recycles webapplikasjonen. Det betyr at session-variabler, cache etc restarter.

Å putte det i en databasetabell er helt fint. Hvis disse variablene leses av ofte så kan du putte de i minnet på serveren vha caching.

Et anet alternativ er å putte de i en XML-fil (ikke web.config, men en eller annen du lager selv). Dette er nok litt vanskeligere enn en database-tabell og ytelsesmessig spiller det ingen rolle da man uansett bør cache dataene.

 

Jeg ville derfor puttet det i en tabell i databasen.

 

Et eksempel på henting av en variabel fra database med caching:

 

public static string GetVariabelValue(string variableName)
{
  string cacheKey = string.Format("variables:{0}", variableName);  
  string value = (string)GetCache(cacheKey);
  if (value == null)
  {
  // Hent verdien fra databasen
  ......
  // Legg verdien i cachen
  SetCache(cacheKey, value);
  }
  return value;
}


public static object GetCache(string key)
{
  System.Web.Caching.Cache c = System.Web.HttpRuntime.Cache;
  return c.Get(key);
}

public static void SetCache(string key, object value)
{
System.Web.Caching.Cache c = System.Web.HttpRuntime.Cache;
c.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 20, 0), System.Web.Caching.CacheItemPriority.Normal, null);
}

Lenke til kommentar

Japp :)

Jeg vet egentlig ikke hva Convert funksjonen er til...

Husker en gang at jeg måtte bruke den fordi jeg ikke kunne caste dette:

 

public unsafe T EnFunksjon<T>(string name)
{
return (T)Marshal.GetDelegateFromUnmanagedThunk(new IntPtr(GetProcAddress(name)));
}

Hvor T måtte være en delegate type.

Husker ikke helt detaljene, men jeg brukte ihvertfall Convert istedet.

Lenke til kommentar
Strengt tatt er vel "riktig" måte å caste på i .net

string value = Convert.ToString(GetCache(chacheKey));

Og ikke

string value = (string)GetCache(cacheKey);

 

Dette spiller strengt tatt ingen rolle da man allerede vet hvordan type objekt som ligger i cachen hvis det ligger der. Dessuten kan man på denne måte caste til alle type objekter som DataSet, List<object> osv... Convert er ikke mer korrekt enn de to andre måtene her, men .ToString() vil gi deg en NullReferenceException dersom objektet er null, derfor bør man ikke bruke den i denne sammenheng...

Lenke til kommentar

As er korrekt måte å gjøre det på, siden denne ikke kaster exception dersom konvertering feiler.

 

Dessuten må du alltid teste om et objekt er null dette er kanskje noe av det viktigste du gjør da det er opphav til ufattelig mange bugs i alle programmer.

string value;
if((value = GetCache(cachekey) as string) == null)
 // Feilbehandling her

 

er korrekt måte, dersom det uansett ligger en string(eller en annen klasse) i GetCache

 

Dersom det derimot er integer eller andre primitiver, og du skal ha en string, skal du bruke ToString.

 

Dersom det kan ligge hva som helst, må du sjekke først om det er null

 

object o;
string value = "";
if((o = GetCache(cachekey)) != null)
 value = o.ToString();

 

Vær veldig obs på å sjekke referanser når du bruker klasser.

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...