2011-09-10 7 views
1

나는 내가 (내가 두 변수 jsonDataCachejsonData을 가지고 있지만 내가 예를 들어 하나, jsonData을 갖고 싶어) 그런 식으로 채우는하고 익명 형식의 변수가 있습니다익명 형식을 어떻게 정의 할 수 있습니까?

var jsonData = new 
      { 
       total = totalPages, 
       page = page, 
       records = totalRecords, 

       rows = (from b in myData 
       select new 
         { 
         //do things 
         }).ToArray() 
      }; 
return Json(jsonData, JsonRequestBehavior.AllowGet); 

을하지만 난 처음이 변수를 정의하려면 내가 그것을 채우기 전에, 기본적으로 나는 다음과 같이하고 싶다.

var jsonData = null; 

//check if jsonData in cache and if it is return Json(jsonData, JsonRequestBehavior.AllowGet); 

jsonData = new 
       { 
        total = totalPages, 
        page = page, 
        records = totalRecords, 

        rows = (from b in myData 
        select new 
          { 
          //do things 
          }).ToArray() 
       }; 
//put jsonData in cache by key 

return Json(jsonData, JsonRequestBehavior.AllowGet); 

어떻게 할 수 있을까?

내가 캐시를 소개하기 때문에 그 이유를 알고 싶습니다. 그래서 캐시에서 확인하는 것보다 변수를 먼저 정의해야합니다. 그렇지 않으면 위의 것을 수행 할 것입니다. 현재 두 변수를 사용했는데 bot 하나만 사용하려고합니다. 여기

내가 현재 수행하는 방법입니다 :

public virtual JsonResult GetSomething(int id, int type) 
{ 
    string keyPrefix = GetKeyPrefix(id, type); 

    var jsonDataCache = CacheManager.Get<object>(keyPrefix); 

    if(jsonDataCache != null) 
     return Json(jsonDataCache, JsonRequestBehavior.AllowGet); 

    var myData = GetFromDataase(); 

    var jsonData = new 
        { 
         total = totalPages, 
         page = page, 
         records = totalRecords, 

         rows = (from b in myData 
         select new 
           { 
           //do things 
           }).ToArray() 
        }; 

    CacheManager.Set<object>(keyPrefix, jsonData); 

    return Json(jsonData, JsonRequestBehavior.AllowGet); 
} 

UPDATE :

public virtual JsonResult GetSomething(int id, int type) 
{ 
    string keyPrefix = GetKeyPrefix(id, type); 

    var jsonData = CacheManager.Get<object>(keyPrefix); 

    if(jsonData != null) 
     return Json(jsonData , JsonRequestBehavior.AllowGet); 

    var myData = GetFromDataase(); 

    jsonData = new 
        { 
         total = totalPages, 
         page = page, 
         records = totalRecords, 

         rows = (from b in myData 
         select new 
           { 
           //do things 
           }).ToArray() 
        }; 

    CacheManager.Set<object>(keyPrefix, jsonData); 

    return Json(jsonData, JsonRequestBehavior.AllowGet); 
}    
:
내가 그런 것을해야한다고 생각하는 모든 당신의 도움이 후, 잘하면 갈 올바른 방법입니다
+0

* 왜 * 원하십니까? 이 질문은 아마 –

+0

질문이 업데이트 된 질문을 업데이 트 – jason

답변

2

당신은 정말 더럽고 추한를 제외하고, 그렇게 (null로 초기화) 할 수 없습니다 " 예를 들어 "일반적인 방법과의 전술. 익명 형식의 변수는 초기화와 함께 만 선언 할 수 있습니다 (제네릭 형식 매개 변수는 제외).

그러나 실제로 여기에 필요하지는 않습니다. 실제로,

object jsonData; 

이 충분하면 결코 사용 값입니다. 그 외에도, 나는 목적을 위해 DTO 클래스를 소개 할 때라고 주장한다.

3

음, 같은 속성 이름과 유형을 가진 "예제"를 같은 순서로 더미 값으로 만들 수 있습니다. 예를 들어 :

var jsonData = new { total = 0, page = 0, records = 0, 
        rows = new[] { new { dummy = "" } }; 

그것은 당신이 할 수있는 중첩 된 익명 형식을 원하는 것을 명확하지 않았다, 그래서 난 그냥 문자열 속성을 하나 생성은 dummy을했다.

일반적으로 이런 종류의 일을 피하기 위해을 시도해보십시오. 마크가 말했듯이, 더 큰 그림을 설명 할 수 있다면 더 도움이 될 것입니다.

EDIT : 캐싱을위한 것이라면 정적으로 입력 된 방식으로 캐시를 어떻게 만들 것이라고 기대 했습니까? 수락을 선언 한 Json 메서드는 무엇입니까? object을 수락한다고 선언 된 경우 강력한 입력 변수가 필요하지 않습니까? 일반적이라면 괜찮습니다.하지만 캐시에서 나오는 내용을 적절하게 캐스팅하는 방법으로 되돌아갑니다 ...

+0

업데이 트를 찾는 열쇠입니다 @ Jamie Dixon 같은 개체와 함께 갈 것이 좋습니다 수 제안? – jason

+0

@ jason : 내 답변을 업데이트했습니다. - 그러나 질문은 여전히 ​​명확하지 않습니다. 마치 이것이 어떻게 작동 할 것인지에 대해 당신 자신의 마음 속에 분명히 밝혀지지 않은 것처럼 말입니다. Json 메서드의 서명은 무엇입니까? 캐시를 어떻게 선언 하시겠습니까? –

+0

자세한 내용으로 다시 업데이트되었습니다. – jason

1

왜 이렇게하고 싶은지 확실하지 않지만 한 가지 방법이 있습니다.

입력 할 때 개체를 만들 수 있습니다 object 또는 dynamic

object foo = null; 

foo = new { 
bar = "bar" 
}; 

업데이트 :

내가이 일을 훨씬 더 적절한 방법이 생각하는 당신의 업데이 트를 감안할 때.

개인적으로 나는 System.Web.Caching.Cache을 사용하며 캐시 키를 기반으로하여 항목의 캐시를 확인하거나 데이터를 검색하기 위해 메서드를 실행하는 확장 방법을 사용합니다.

public static T GetOrStore<T>(this Cache cache, string key, Func<T> generator) 
     { 
      var result = cache.Get(key); 
      if(result == null) 
      { 
       result = generator(); 
       cache.Insert(key,result); 
      } 

      return (T) result; 
     } 

당신처럼 사용할 수있는 :

var jsonData = Cache.GetOrStore("jsonData", Foo); 

여기서

private static string Foo() 
{ 
    return new {[...]} 
} 
+0

나는 박쥐가 그것이 효과가있을 것이라는 확신이 없다고 생각하고 있었다. – jason

+0

글쎄, 당신은 과제를 수행 할 수있을 것이다. 그러나 당신은 강하게 타이핑 된 방식으로 그것을 사용할 수 없을 것이다. –

+0

@jason 내 업데이트를 참조하십시오. 나는 이것이 당신이 원하는 것과 더 비슷하다고 생각합니다. –

관련 문제