微软EnterLib的Policy Injection Application Block(PIAB)是一个比较好用的轻量级的AOP框架,你可以通过创建自定义的CallHandler实现某些CrossCutting的逻辑,并以自定义特性或者配置的方式应用到目标方法上面。PIAB自身也提供了一系列的CallHandler,其中CachingCallHandler直接利用HttpRuntime的Cache实现了基于方法级别的缓存。但是,PIAB发布到现在,CachingCallHandler就一直存着一个问题:如果目标方法具有Out参数并且返回类型不是void,会抛出IndexOutOfRangeException,如果返回类型为void,out参数也不会被缓存。不知道微软对此作何考虑,反正我觉得这是一个不可原谅的Bug。(Source Code从这里下载)

一、问题重现

这个问题还还重现,为了比较我们先来看看正常情况下CachingCallHandler的表现。下面我定义了一个简单的接口:IMembershipService, 包含一个方法GetUserName根据传入的User ID返回User Name。MembershipService实现了该接口,为了方便大家确定方法执行的结果是否被缓存,我让每次执行都返回一个GUID。CachingCallHandler直接以自定义特性的方式应用到GetUserName方法上。

using System;
using System.Threading;
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;
namespace CachingCallHandler4OutParam
   5: {
interface IMembershipService
   7:     {
string userId);
   9:     }
  10:  
class MembershipService : IMembershipService
  12:     {        
  13:         [CachingCallHandler]
string userId)
  15:         {
return Guid.NewGuid().ToString();
  17:         }
  18:     }
  19: }

相关文章:

  • 2021-07-11
  • 2021-06-14
  • 2021-12-22
  • 2021-06-25
  • 2021-08-01
  • 2021-06-01
  • 2021-10-14
猜你喜欢
  • 2021-12-21
  • 2021-07-05
  • 2021-09-06
  • 2021-08-31
  • 2021-08-17
  • 2021-11-10
相关资源
相似解决方案