Attualmente ho la mia funzionalità VaryByCustom implementato in classi che implementano l'interfaccia IOutputCacheVaryByCustom
modo migliore per creare dinamicamente le classi invece di utilizzare un blocco switch
public interface IOutputCacheVaryByCustom
{
string CacheKey { get; }
HttpContext Context { get; }
}
Una classe che implementa questa interfaccia ha poche convenzioni il nome della classe sarà "OutputCacheVaryBy_______" dove lo spazio vuoto è il valore che viene passato dalla proprietà varyByCustom alle pagine. L'altra convenzione è che il contesto verrà impostato tramite l'iniezione del costruttore.
Attualmente mi sto basando questa via un enum e uno switch simile a
public override string GetVaryByCustomString(HttpContext context,
string varyByCustomTypeArg)
{
//for a POST request (postback) force to return back a non cached output
if (context.Request.RequestType.Equals("POST"))
{
return "post" + DateTime.Now.Ticks;
}
var varyByCustomType = EnumerationParser.Parse<VaryByCustomType?>
(varyByCustomTypeArg).GetValueOrDefault();
IOutputCacheVaryByCustom varyByCustom;
switch (varyByCustomType)
{
case VaryByCustomType.IsAuthenticated:
varyByCustom = new OutputCacheVaryByIsAuthenticated(context);
break;
case VaryByCustomType.Roles:
varyByCustom = new OutputCacheVaryByRoles(context);
break;
default:
throw new ArgumentOutOfRangeException("varyByCustomTypeArg");
}
return context.Request.Url.Scheme + varyByCustom.CacheKey;
}
Dal So sempre che la classe sarà OutputCacheVaryBy + varyByCustomTypeArg
e l'unico argomento del costruttore sarò context
ho capito che potevo escludere che necessitano questo glorificato se altro blocca e potrebbe semplicemente istanziare il mio stesso oggetto con Activator
.
Con questo detto, la riflessione non è il mio forte seme e so che Activator
è sostanzialmente lento rispetto alla creazione statica e altri modi per generare oggetti. C'è qualche ragione per cui dovrei attenermi a questo codice attuale o dovrei usare Activator
o un modo simile per creare il mio oggetto?
ho visto il blog http://www.smelser.net/blog/post/2010/03/05/When-Activator-is-just-to-slow.aspx, ma io non sono davvero sicuro di come questo si applica dal momento che sto lavorando con i tipi in fase di esecuzione T. non statica
Gli oggetti costosi (richiedono molto tempo) da creare? È il contesto richiesto durante la costruzione, può invece essere impostato tramite la proprietà Contesto? La risposta a queste domande è necessaria per fornire la soluzione migliore. –
Nessun oggetto banale da creare e il contesto dovrebbe essere impostato in modo ottimale nel costruttore perché è una dipendenza principale della classe, tuttavia potrebbe essere esposto e impostato sulla proprietà ma lascerà spazio per gli NRE. –
quale versione di C# stai usando? –