我正在考虑使用 Castle Windsor 的拦截器来缓存数据,以帮助扩展 asp.net 站点。

有人有这样做的想法/经验吗?

小澄清:我的目的是使用 Windsor 拦截“昂贵”的调用并委托给 MemCacheD 或 Velocity(或其他分布式缓存)进行缓存本身。

有帮助吗?

解决方案

我一直在 Windsor 中使用缓存装饰器(而不是拦截器),它们工作得很好。

拦截器对此也有好处,请参阅 例如。

其他提示

嘿,我们使用了温莎城堡拦截器,基于这篇文章: http://www.davidhayden.com/blog/dave/archive/2007/03/14/CastleWindsorAOPPolicyInjectionApplicationBlock.aspx 以及上面提到的那个。

我发现整个事情非常简单,而且这是一种非常优雅的 AOP 方式。然而....

但要小心表演。使用拦截会创建一个动态代理,这肯定会减慢速度。根据我们使用 500 个节点计算场的基准测试,我们发现通过在 Windsor 中使用拦截,性能下降了约 30%,这也超出了我们在拦截内所做的事情(本质上是记录方法调用和传递到我们的方法的参数) 。简单地删除拦截就可以大大加快整个应用程序的速度。

小心不要拨打昂贵的电话 真的 昂贵的。:) 如果我是你,我会考虑在不同级别进行缓存,可能是通过实现 IRepository 类型模式,然后在适当的情况下使用各种缓存策略来支持它。

祝你好运,

--
马特。

您如何实施数据访问?如果您使用 NHibernate,我建议在这里进行缓存。NHibernate 附带了适用于 .NET 内置缓存、memcached(通过 NMemcachD)和 Velocity 的缓存策略。我在企业级应用程序中广泛使用了 memcached,并且没有遇到任何问题。

基于拦截器的缓存机制是一个有趣的想法,我以前没有想到过。透明地申请将非常容易。我认为我喜欢使用 Castle 的 AOP 功能的原因是它是基于代理的,您不必用属性污染您的代码。

我会看看 微软速度. 。如果您计划创建企业应用程序,这可能是一个不错的解决方案

我在名为的开源项目上创建了 温莎城堡 使用缓存拦截器。它是一种通用的缓存解决方案。

这是一个简单的用法示例:

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

Windsor 很棒,但是当您有多种内置的数据缓存方法时,为什么还要使用它来缓存。Windsor 在其他领域有其基础,不一定是缓存。从缓存对象到会话到cookie。缓存的方法有很多种。更重要的是,在大型应用程序中,您最终需要分布式缓存。MS 正在为此开发一款产品,并且市场上有一些优秀的供应商拥有产品。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top