ASP.NET: Donut caching ja kontrollerite kasutamine
02.04.2010 | Gunnar
ASP.NET pakub arendajatele päris võimsat puhverdamise tuge. Üks tore asi on cache substitution, mis tähendab seda, et moodustub aukudega puhver, mille augud täidetakse igal pöördumisel uuesti ära selleks ettenähtud staatiliste meetodite abil. ASP.NET maailmas tuntud ScottGu andis sellele tehnikale lihtsama ja rahvalikuma nime: donut caching. Käesolevas postituses toon ühe tavalisest pisut keerukama näite cache substitution kasutamise kohta, mis arendajatele kasulikuks võib osutuda.
Aukliku puhverdamise kohta leiab esmase ülevaate ScottGu blogi postitusest Tip/Trick: Implement "Donut Caching" with the ASP.NET 2.0 Output Cache Substitution Feature. Antud näites kasutatakse auklikku puhverdamist selleks, et kuvada puhverdatud lehtedel käesoleva kasutaja kasutajanime. Kes probleemiga on kokku puutunud, see teab, et taolised vajadused on suhteliselt vastikud ja teevad muidu muhedast puhverdamisest kergesti paraja luupainaja.
Probleem
Kui ScottGu lahendas lihtsa probleemi, mille näidet näed selle lõigu kõrval paremal, siis minul oli vaja lahendada pisut keerukam juhtum, kus pelgalt stringi kokku vorpimine ja väljastamine oleks kõikide heade tavade rikkumine – osa graafilist disaini asuks sel juhul kompileeritud koodis. Järgnevad kaks jubinat võiks teile kuskilt ehk tuttavad ette tulla.
Et portaal kasutab väljundi puhverdamist (ja lisaks veel mitmeid muid meeldivaid optimeerimise nõkse), siis oli vaja kuidagi need sisselogimise alad lahendada ära selliselt, et puhverdamine ei toimuks kasutajapõhiselt (1400 * lehtede arv pole kuigi tore puhvri suurus), kuid samas ei tuleks ka midagi liiga keerukat teha.
Lahendus – auklik puhver koos kontrolleritega
Esimese asjana lammutasin ma laiali senise pisikese ja mugava kontrolleri, mis sõltuvalt sellest, kas kasutaja oli sisse loginud või ei, kuvas vastavat logimise plokki. Tulemusena tekkis kaks uut kontrollerit:
- kontroller anonüümsete kasutajate jaoks,
- kontroller sisse loginud kasutajate jaoks.
Senine kontroller on lihtsalt sisenemispunkt, mis langetab otsuse, et milline uutest kontrolleritest laadida tuleb. Kontroller sisaldab ühte Substitution kontrollerit, mis loob puhvrisse augu. Kontrolleri taga jooksev ShowLogInBox() meetod tegeleb igal pöördumisel augu täitmisega.
Kontrolleri definitsioon on lihtne.
<%@ Control EnableViewState="false"
Inherits="MyPortal.Profiles.LogInControl" %>
<asp:Substitution runat="server" MethodName="ShowLogInBox" />
Nagu näha, pole siin midagi muud peale Substitution kontrolleri definitsiooni. LogInControl defineerib ära ShowLogInBox() meetodi, mis näeb välja järgmine.
{
var user = SPContext.Current.Web.CurrentUser;
string controlName;
if (user != null)
controlName = "AuthenticatedLogInControl.ascx";
else
controlName = "AnonymousLogInControl.ascx";
var path = "~/_controltemplates/" + controlName;
// Tervitused Sarviktaadile @ 10000
var output = new StringBuilder(10000);
using(var page = new Page())
using(var ctl = page.LoadControl(path))
using(var writer = new StringWriter(output))
using(var htmlWriter = new HtmlTextWriter(writer))
{
ctl.DataBind();
ctl.RenderControl(htmlWriter);
}
return output.ToString();
}
Dünaamiline kontrollerite laadimine ja neilt väljundi väljapressimine pole ehk kõige korrektsemad lahendused kui vaadata mööda lehe elutsüklist, kuid antud juhul meil pole ka rohkemat vaja, et töö tehtud saaks.
Loomulikult tuleb mind nüüd kiita selle eest, et ma using-plokke äärmise vastutustundega kasutanud olen ilma, et koodi loetavus oluliselt kannatada saaks.
Lõpetuseks
Aukliku puhverdamisega saab lahendada ära mitmed probleemid pidevalt muutuva sisu kuvamisega puhverdatud lehtedel. Kuigi aukude täitmine on ASP.NET poolt lahendatud küllaltki robustselt, saab siiski keerukamatel juhtudesl auke täita selliselt, et halbu häkke vaja ei lähe. Käesolevas näites saime hakkama küllaltki viisakalt.
Kes soovib ASP.NET teemadel teiste arendajatega suhelda, siis võib julgelt oma küsimused ja mõtted kirja panna Eneta arenduse foorumisse. Ja loomulikult on minul alati hea meel kui oma küsimused siia postitate – hoian mõlemal kanalil silma hoolega peal.
