首页 / 软件开发 / .NET编程技术 / Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于Caching
Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于Caching2010-08-18 cnblogs ArtechEnterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于CachingCallHandler的Bug微软EnterLib的Policy Injection Application Block(PIAB)是一个比较好用的轻量级的AOP框架,你可以通过创建自定义的CallHandler 实现某些CrossCutting的逻辑,并以自定义特性或者配置的方式应用到目标方法上面。PIAB自身也提供了一系列的CallHandler,其中 CachingCallHandler直接利用HttpRuntime的Cache实现了基于方法级别的缓存。但是,PIAB发布到现在,CachingCallHandler就一直存着一个 问题:如果目标方法具有Out参数并且返回类型不是void,会抛出IndexOutOfRangeException,如果返回类型为void,out参数也不会被缓存。 不知道微软对此作何考虑,反正我觉得这是一个不可原谅的Bug。一、问题重现这个问题还还重现,为了比较我们先来看看正常 情况下CachingCallHandler的表现。下面我定义了一个简单的接口:IMembershipService, 包含一个方法GetUserName根据传入的User ID返回 User Name。MembershipService实现了该接口,为了方便大家确定方法执行的结果是否被缓存,我让每次执行都返回一个GUID。 CachingCallHandler直接以自定义特性的方式应用到GetUserName方法上。1: using System;
2: using System.Threading;
3: using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;
4: namespace CachingCallHandler4OutParam
5: {
6: public interface IMembershipService
7: {
8: string GetUserName(string userId);
9: }
10:
11: public class MembershipService : IMembershipService
12: {
13: [CachingCallHandler]
14: public string GetUserName(string userId)
15: {
16: return Guid.NewGuid().ToString();
17: }
18: }
19: }
现在,在Main方法中,编写如下的代码:通过PolicyInjection的Create<TType, TInterface>创建能够被PIAB截获的Proxy对象,并在一个无限循环中传入相同的参数调用GetUserName方法。从输出结果我们看到,返回的 UserName都是相同的,从而证明了第一次执行的结果被成功缓存。1: using System;
2: using System.Threading;
3: using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;
4: namespace CachingCallHandler4OutParam
5: {
6: class Program
7: {
8: static void Main(string [] args)
9: {
10: IMembershipService svc = PolicyInjection.Create<MembershipService, IMembershipService>();
11: while(true)
12: {
13: Console.WriteLine(svc.GetUserName("007"));
14: Thread.Sleep(1000);
15: }
16: }
17: }
18: }
输出结果:E1E8EA0F-7620-4879-BA5D-33356568336E
E1E8EA0F -7620-4879-BA5D-33356568336E
E1E8EA0F-7620-4879-BA5D-33356568336E
E1E8EA0F-7620-4879-BA5D-33356568336E
E1E8EA0F-7620-4879-BA5D-33356568336E
E1E8EA0F-7620-4879-BA5D-33356568336E