現在、VaryByCustom機能をインターフェイスを実装するクラスに実装していますIOutputCacheVaryByCustom
public interface IOutputCacheVaryByCustom
{
string CacheKey { get; }
HttpContext Context { get; }
}
このインターフェイスを実装するクラスにはいくつかの規則があり、クラスの名前は「OutputCacheVaryBy_______」になります。ここで、空白はページのvaryByCustomプロパティから渡される値です。もう1つの規則は、コンストラクターの挿入によってコンテキストが設定されるというものです。
現在、私はこれを列挙型と次のようなswitchステートメントに基づいています
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;
}
OutputCacheVaryBy + varyByCustomTypeArg
クラスがであり、コンストラクター引数が唯一であることが常にわかっているのでcontext
、elseブロックの場合、これを美化する必要はなく、自分のオブジェクトを。でインスタンス化できることに気付きましたActivator
。
そうは言っても、リフレクションは私の強みではなく、Activator
静的な作成やオブジェクトを生成する他の方法に比べてかなり遅いことを私は知っています。この現在のコードに固執する必要がある理由はありますActivator
か、それともオブジェクトを作成するためにまたは同様の方法を使用する必要がありますか?
ブログhttp://www.smelser.net/blog/post/2010/03/05/When-Activator-is-just-to-slow.aspxを見たことがありますが、これがどのように適用されるかはよくわかりません。静的Tではなく実行時に型を操作しているためです。