Spring.Caching.AspNetCache - Условие, основанное на ReturnValue - Условие в языке выражений Spring - PullRequest
1 голос
/ 12 января 2012

Я использую Cache Aspect с ASP.NET Cache. Мне нужно создать условие на основе ReturnValue.

Я упростил мою проблему. Я использую аспект CacheResult для метода, который возвращает простой объект POCO.

Вот определение:

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.

Я в Google, я могу использовать ключевое слово ReturnValue примерно так:

Condition = "#ReturnValue != null"

Но я не знаю, как мне получить доступ к MyResponse.MyData.Length.

1 Ответ

3 голосов
/ 12 января 2012

контекст для вычисления выражения условия является возвращаемым значением, поэтому просто сделайте это:

Condition = "Result.Length > #batchLimit"

эквивалентно

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