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