2008-09-18 17 views
7

Estoy considerando usar los Interceptores de Castle Windsor para almacenar datos en caché para ayudar a escalar un sitio asp.net.Windsor Interceptors AOP & Caching

¿Alguien tiene alguna idea/experiencia al hacer esto?

Clarificación menor: Mi intención era usar Windsor para interceptar llamadas 'costosas' y delegar a MemCacheD o Velocity (u otra memoria caché distribuida) para el almacenamiento en caché.

Respuesta

2

He estado utilizando decoradores de caché (no interceptores) con Windsor y funcionan muy bien.

Los interceptores son buenos para esto también, vea this por ejemplo.

+0

Gracias, Mausch. He bajado por el camino del decorador también. –

+4

Decoradores de almacenamiento en caché? ¿Cómo difiere eso de los interceptores? en términos de su declaración utilizando un registro fluido? Ejemplos por favor. – IanT8

+0

Sería genial tener un ejemplo de estos decoradores. – Remotec

-2

Windsor es genial, pero ¿por qué usar eso para el almacenamiento en caché cuando tiene varias formas de almacenar datos en caché? Windsor tiene su base en otras áreas, no necesariamente en el almacenamiento en caché. Desde el objeto de caché a la sesión a las cookies. Hay muchas formas de almacenar en caché. Más importante aún en aplicaciones grandes, terminas necesitando almacenamiento en caché distribuido. MS está trabajando en un producto para eso y hay un par de buenos proveedores que tienen productos en el mercado.

+0

Gracias, Thomas. Mi intención era usar Windsor para interceptar llamadas 'caras' y delegar en MemCacheD o Velocity para el almacenamiento en caché. –

1

¿Cómo está implementando su acceso a los datos? Si usas NHibernate, te sugiero que guardes el caché aquí. NHibernate viene con estrategias de caché para la memoria caché incorporada de .NET, memcached (a través de NMemcachD) y Velocity. He utilizado memcached extensivamente para aplicaciones de nivel empresarial y no he tenido ningún problema con él.

Un mecanismo de caché basado en un interceptor es una idea interesante, una que no había pensado antes. Sería muy fácil aplicar de forma transparente. El que creo que me encanta usar las características AOP de Castle es porque está basado en proxy, no tienes que contaminar tu código con atributos.

+0

gracias, chris Desafortunadamente, solo una pequeña parte de los datos procede de NHibernate. La mayoría de los datos provienen de Sharepoint y hay una necesidad de agregar metadatos a través de múltiples listas (no preguntes :-)) –

4

Hola, hemos utilizado Castle Windsor Interceptors, basado en este artículo: http://www.davidhayden.com/blog/dave/archive/2007/03/14/CastleWindsorAOPPolicyInjectionApplicationBlock.aspx y el mencionado anteriormente.

Me pareció todo muy fácil y es una forma muy elegante de hacer AOP. Sin embargo ...

Sin embargo, cuidado con el rendimiento. El uso de interceptación crea un proxy dinámico que definitivamente ralentizará las cosas. En base a nuestros puntos de referencia usando una granja de cómputo de 500 Node vimos una disminución del rendimiento de aproximadamente 30% al usar interceptación en Windsor, esto estaba más allá de lo que estábamos haciendo dentro de la interceptación (esencialmente llamadas de método de registro y parámetros pasados ​​a nuestros métodos) . y simplemente eliminar la intercepción aceleró la aplicación completa bastante.

Tenga cuidado de no hacer sus costosas llamadas realmente caro. :) Si yo fuera usted, buscaría almacenar en caché en un nivel diferente, probablemente mediante la implementación de un patrón de tipo IRepository y luego respaldarlo con varias estrategias de almacenamiento en caché, según corresponda.

Buena suerte,

-
Mat.

+0

No puedo estar seguro, pero la intercepción parece haberse acelerado mucho en 3.0 – Malachi

0

Creé en proyecto de código abierto llamado cachew.castlewindsor con un interceptor de caché. Es una solución de uso general para el almacenamiento en caché.

Aquí es un simple ejemplo de uso:

var container = new WindsorContainer(); container.Register(Component.For<CacheInterceptor>() .Instance(new CacheInterceptor(new Cache(TimeoutStyle.RenewTimoutOnQuery, TimeSpan.FromSeconds(3))))); container.Register(Component.For<IServer>().ImplementedBy<Server>().Interceptors<CacheInterceptor>());

El comportamiento por defecto es para almacenar en caché todos los métodos que se inicia con GET y la información sobre rendimiento, pero también se puede cambiar lo prefijos de caché.

El proyecto está disponible en Nuget: http://www.nuget.org/packages/Cachew.CastleWindsor/

y el código fuente está disponible aquí: https://github.com/kobbikobb/Cachew