Spring.Caching.AspNetCache - 基于ReturnValue的条件 - Spring表达式语言中的条件

时间:2012-01-11 20:01:23

标签: caching spring.net spring-aop spring-el

我将缓存方面与ASP.NET缓存一起使用。我需要基于ReturnValue创建条件。

我简化了我的问题。我在返回简单POCO对象的方法上使用CacheResult方面。

这是定义:

public class MyData
{
    public string MyProperty { get; set; }
}

public class MyResponse
{
    public int MyId { get; set; }
    public MyData [] Result { get; set; }
}

我需要为缓存创建条件 - 仅当MyResponse.MyData.Lenght大于批量限制时才缓存结果。

[CacheResult("AspNetCache", "'MyResponse.MyId=' + #id", 
             Condition = "MyResponse.Result.Length > #batchLimit")]
public MyResponse GetResponse(int id, int batchLimit)
{
    Thread.Sleep(5000);
    return new MyResponse
               {
                   MyId = 1,
                   Result =
                       new MyData[]
                           {
                               new MyData {MyProperty = "A"}, new MyData {MyProperty = "B"},
                               new MyData {MyProperty = "C"},
                           }
               };
}

我尝试了这个条件的定义:

Condition = "MyResponse.Result.Length > #batchLimit"

我收到了这个错误:

  

无法为指定的上下文解析“MyResponse”节点   [Sample.MyResponse]。

所以我尝试了第二个版本:

Condition = "'MyResponse.Result.Length' > #batchLimit"

完成错误:

Cannot compare instances of [System.String] and [System.Int32] because they cannot be coerced to the same type.

我谷歌我可以使用这样的关键字ReturnValue

Condition = "#ReturnValue != null"

但我不知道如何访问MyResponse.MyData.Length

1 个答案:

答案 0 :(得分:3)

评估条件表达式的上下文是返回值,所以只需执行以下操作:

Condition = "Result.Length > #batchLimit"

相当于

Condition = "#root.Result.Length > #batchLimit"