【发布时间】:2010-09-10 19:11:39
【问题描述】:
我正在考虑使用 Castle Windsor 的拦截器来缓存数据以帮助扩展 asp.net 站点。
有人对此有任何想法/经验吗?
小说明: 我的意图是使用 Windsor 来拦截“昂贵”的调用并将缓存本身委托给 MemCacheD 或 Velocity(或其他分布式缓存)。
【问题讨论】:
标签: .net castle-windsor aop
我正在考虑使用 Castle Windsor 的拦截器来缓存数据以帮助扩展 asp.net 站点。
有人对此有任何想法/经验吗?
小说明: 我的意图是使用 Windsor 来拦截“昂贵”的调用并将缓存本身委托给 MemCacheD 或 Velocity(或其他分布式缓存)。
【问题讨论】:
标签: .net castle-windsor aop
Windsor 很棒,但是当您有多种内置方式来缓存数据时,为什么还要使用它来缓存。温莎在其他领域有其基础,不一定是缓存。从缓存对象到会话再到 cookie。有很多方法可以缓存。更重要的是,在大型应用程序中,您最终需要分布式缓存。 MS 正在为此开发一种产品,并且有几个很好的供应商在市场上有产品。
【讨论】:
我会看看Microsoft Velocity。如果您计划创建企业应用程序,这可能是一个不错的解决方案
【讨论】:
您是如何实现数据访问的?如果您使用 NHibernate,我建议您在此处进行缓存。 NHibernate 带有用于 .NET 内置缓存、memcached(通过 NMemcachD)和 Velocity 的缓存策略。我已经将 memcached 广泛用于企业级应用程序,并且没有遇到任何问题。
基于拦截器的缓存机制是一个有趣的想法,我以前没有想到过。透明地应用将非常容易。我喜欢使用 Castle 的 AOP 功能的一个原因是因为它是基于代理的,你不必用属性污染你的代码。
【讨论】:
我一直在 Windsor 中使用缓存装饰器(不是拦截器),它们效果很好。
拦截器也适用于此,例如,参见 this。
【讨论】:
嘿,我们使用了温莎城堡拦截器,基于这篇文章:http://www.davidhayden.com/blog/dave/archive/2007/03/14/CastleWindsorAOPPolicyInjectionApplicationBlock.aspx 以及上面提到的那个。
我发现整个事情非常简单,而且这是一种非常优雅的 AOP 方式。不过……
但对性能要小心。使用拦截会创建一个动态代理,这肯定会减慢速度。根据我们使用 500 节点计算场的基准测试,我们发现在 Windsor 中使用拦截会降低大约 30% 的性能,这超出了我们在拦截内部所做的工作(本质上是记录方法调用和传递给我们的方法的参数) .并且简单地删除拦截加速了整个应用程序。
小心,不要让昂贵的电话真的变得昂贵。 :) 如果我是你,我会寻找不同级别的缓存,可能通过实现 IRepository 类型模式,然后在适当的情况下使用各种缓存策略支持它。
祝你好运,
--
马特。
【讨论】:
我在名为 cachew.castlewindsor 的开源项目上创建了一个带有缓存拦截器的项目。 它是一种通用的缓存解决方案。
这是一个简单的用法示例:
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>());
默认行为是缓存所有以 Get 开头的方法并返回数据,但您也可以更改要缓存的前缀。
该项目在 nuget 上可用: http://www.nuget.org/packages/Cachew.CastleWindsor/
源代码可在此处获得: https://github.com/kobbikobb/Cachew
【讨论】: