【问题标题】:Windsor Interceptors AOP & CachingWindsor 拦截器 AOP 和缓存
【发布时间】:2010-09-10 19:11:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net castle-windsor aop


    【解决方案1】:

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

    【讨论】:

    • 谢谢,托马斯。我的意图是使用 Windsor 来拦截“昂贵”的调用并将缓存本身委托给 MemCacheD 或 Velocity。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,克里斯 不幸的是,只有一小部分数据来自 NHibernate。大部分数据来自 Sharepoint,需要跨多个列表聚合元数据(不要问 :-))
      【解决方案4】:

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

      拦截器也适用于此,例如,参见 this

      【讨论】:

      • 谢谢,莫施。我也走上了装饰师之路。
      • 缓存装饰器?这与拦截器有何不同?就其使用流利注册的声明而言?请举例。
      • 如果有这些装饰器的例子会很棒。
      【解决方案5】:

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

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

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

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

      祝你好运,

      --
      马特。

      【讨论】:

      • 我不能确定,但​​拦截似乎在 3.0 中加快了很多
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2018-03-05
        • 1970-01-01
        • 2012-04-26
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 2018-01-31
        相关资源
        最近更新 更多