Zur Zeit habe ich meine VaryByCustom Funktionalität in Klassen implementiert, die eine Schnittstelle IOutputCacheVaryByCustom
Der beste Weg, um dynamisch Klassen zu erstellen, anstatt einen Schalter Block mit
public interface IOutputCacheVaryByCustom
{
string CacheKey { get; }
HttpContext Context { get; }
}
Eine Klasse der Umsetzung diese Schnittstelle implementieren hat ein paar Konventionen die Namen der Klasse wird "OutputCacheVaryBy_______" sein, wobei das Leerzeichen der Wert ist, der von der varyByCustom-Eigenschaft auf Seiten übergeben wird. Die andere Konvention ist, dass Context durch Konstruktorinjektion gesetzt wird.
Derzeit bin stützen ich das eine Enumeration und eine switch-Anweisung ähnlich wie
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;
}
off Da ich weiß immer, dass die Klasse OutputCacheVaryBy + varyByCustomTypeArg
sein wird und der einzige Konstruktorargument wird context
mir klar, ich umgehen konnte, um Dies verherrlicht, wenn sonst blockieren und könnte nur mein eigenes Objekt mit Activator
instanziieren.
Mit diesem gesagt, ist Reflexion nicht meine starke Farbe und ich weiß, dass Activator
im Vergleich zu statischen Erstellung und anderen Möglichkeiten, Objekte zu generieren, im Wesentlichen langsam ist. Gibt es einen Grund, warum ich bei diesem aktuellen Code bleiben sollte oder sollte ich Activator
oder eine ähnliche Methode verwenden, um mein Objekt zu erstellen?
Ich habe den Blog http://www.smelser.net/blog/post/2010/03/05/When-Activator-is-just-to-slow.aspx gesehen, aber ich bin nicht wirklich sicher, wie dies gelten würde, da ich mit Typen zur Laufzeit nicht statisch T.
Sind die Objekte teuer (zeitaufwändig) zu erstellen? Ist der Kontext während der Erstellung erforderlich, kann er stattdessen über die Context-Eigenschaft festgelegt werden? Die Antwort auf diese Fragen ist erforderlich, um die beste Lösung zu bieten. –
Nein die Objekte trivial zu erstellen, und der Kontext wäre optimal im Konstruktor festgelegt, da dies eine Kernabhängigkeit der Klasse ist, aber es könnte ausgesetzt und auf der Eigenschaft festgelegt werden, aber das lässt Raum für NREs. –
Welche Version von C# verwenden Sie? –