Actualmente tengo mi funcionalidad VaryByCustom implementado en las clases que implementan una interfaz IOutputCacheVaryByCustom
mejor manera de crear dinámicamente clases en lugar de utilizar un bloque de interruptores
public interface IOutputCacheVaryByCustom
{
string CacheKey { get; }
HttpContext Context { get; }
}
Una clase que implementa esta interfaz tiene una serie de convenciones el nombre de la clase será "OutputCacheVaryBy_______" donde el espacio en blanco es el valor que se pasa desde la propiedad varyByCustom en las páginas. La otra convención es que Contexto se establecerá a través de la inyección de constructor.
Actualmente estoy basando esta fuera una enumeración y una sentencia switch similar a
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;
}
Desde siempre sé que la clase será OutputCacheVaryBy + varyByCustomTypeArg
y el único argumento del constructor será context
me di cuenta que podía pasar por alto necesidad este glorificado si no más bloquea y podría simplemente crear una instancia de mi propio objeto con Activator
.
Dicho esto, la reflexión no es mi fuerte y sé que Activator
es sustancialmente lento comparativamente a la creación estática y otras formas de generar objetos. ¿Hay alguna razón por la cual debería seguir con este código actual o debería usar Activator
o una forma similar de crear mi objeto?
he visto el blog http://www.smelser.net/blog/post/2010/03/05/When-Activator-is-just-to-slow.aspx pero no estoy muy seguro de cómo esto se aplicaría ya que estoy trabajando con tipos en tiempo de ejecución no T. estática
¿Los objetos son caros (lentos) para crear? ¿Se requiere el contexto durante la construcción? ¿Se puede establecer a través de la propiedad Contexto? La respuesta a estas preguntas es necesaria para proporcionar la mejor solución. –
No hay objetos triviales para crear, y el contexto se establecería de manera óptima en el constructor porque esa es una dependencia central de la clase, pero podría exponerse y establecerse en la propiedad, pero eso deja espacio para los NRE. –
¿qué versión de C# estás usando? –