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