В настоящее время моя функциональность VaryByCustom реализована в классах, реализующих интерфейс IOutputCacheVaryByCustom
public interface IOutputCacheVaryByCustom
{
string CacheKey { get; }
HttpContext Context { get; }
}
Класс, реализующий этот интерфейс, имеет несколько соглашений, имя класса будет «OutputCacheVaryBy_______», где пробел значение, которое передается из свойства varByCustom на страницах. Другое соглашение состоит в том, что Context будет установлен через внедрение конструктора.
В настоящее время я ' Основываясь на перечислении и инструкции 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
(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 + varByCustomTypeArg
, и единственным аргументом конструктора будет context
Я понял, что я мог бы обойтись без этого прославленного блока if else и просто создать экземпляр моего собственного объекта с помощью Activator
.
С учетом сказанного, отражение не является моей сильной стороной, и я знаю, что активатор
существенно медленнее по сравнению со статическим созданием и другими способами создания объектов. Есть ли какая-либо причина, почему я должен придерживаться этого текущего кода, или я должен использовать Activator
или подобный способ создания моего объекта?
Я видел блог http://www.smelser.net/blog/post/2010/03/05/When-Activator-is-just-to-slow.aspx , но я ' Я не совсем уверен, как это будет применяться, так как я работаю с типами во время выполнения, а не со статическим T.