7

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

有没有人对此有任何想法/经验?

小说明:我的意图是使用 Windsor 来拦截“昂贵”的调用,并将缓存本身委托给 MemCacheD 或 Velocity(或另一个分布式缓存)。

4

6 回答 6

4

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

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

不过要小心性能。使用拦截会创建一个动态代理,这肯定会减慢速度。根据我们使用 500 节点计算场的基准测试,我们发现在 Windsor 中使用拦截会降低大约 30% 的性能,这超出了我们在拦截内部所做的工作(本质上是记录方法调用和传递给我们的方法的参数) . 并且简单地删除拦截加速了整个应用程序。

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

祝你好运,

——
马特。

于 2008-10-13T13:23:33.523 回答
2

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

拦截器对此也有好处,例如看到这个。

于 2008-09-24T04:59:54.170 回答
1

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

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

于 2008-09-18T17:29:52.430 回答
0

我会看看Microsoft Velocity。如果您计划创建企业应用程序,这可能是一个很好的解决方案

于 2008-09-18T17:15:06.350 回答
0

我在名为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

于 2014-10-29T00:27:41.590 回答
-2

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

于 2008-09-18T17:02:01.700 回答