Scumtron Skrevet 4. mars 2008 Skrevet 4. mars 2008 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?
serverside Skrevet 4. mars 2008 Skrevet 4. mars 2008 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); }
Manfred Skrevet 4. mars 2008 Skrevet 4. mars 2008 Strengt tatt er vel "riktig" måte å caste på i .net string value = Convert.ToString(GetCache(chacheKey)); Og ikke string value = (string)GetCache(cacheKey);
GeirGrusom Skrevet 4. mars 2008 Skrevet 4. mars 2008 string value = GetCache(cacheKey).ToString(); er korrekt .NET og vil fungere i alle tilfeller string value = (string)GetCache(cacheKey); forutsetter at objektet enten er et string objekt, eller at det har en operator string funksjon.
Manfred Skrevet 4. mars 2008 Skrevet 4. mars 2008 Men fortsatt er det riktigere å bruke Convert enn å caste med (string)
GeirGrusom Skrevet 4. mars 2008 Skrevet 4. mars 2008 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.
serverside Skrevet 6. mars 2008 Skrevet 6. mars 2008 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...
Manfred Skrevet 6. mars 2008 Skrevet 6. mars 2008 Nei. Skal du caste andre typer objekter skal du bruke as-operatoren: (myObject as DataSet)
GeirGrusom Skrevet 6. mars 2008 Skrevet 6. mars 2008 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.
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå