2010-05-13 3 views
1

처음에는이 게으른 것처럼 보이지 않지만 다음 프로젝트의 코드 조각을 이해하는 데 어려움이 있다고 말하고 싶습니다. .Asp.net Mvc - Kigg : 요청간에 HttpContext.Items의 사용자 개체를 유지하십시오.

http://kigg.codeplex.com/

나는 소스 코드를 통과하고 있었고, 난 내가 만드는 중이라서 내 자신의 작은 프로젝트에 대한 유용한 것이 무엇인가를 알아 차렸다. BaseController에는 다음 코드가 있습니다.

이 코드는 내 필요에 맞게 약간 수정했습니다. 내가 아직도 이해하고있는 코드의이 부분. IUser를 HttpContext.Items에 저장합니다. 나는 그들이 User 객체가 필요할 때마다 데이터베이스를 호출 할 필요가 없도록하기 위해 그렇게한다고 생각한다.

내가 이해할 수없는 부분은 요청 사이에이 개체를 유지하는 방법입니다. 내가 올바르게 이해한다면 HttpContext.Items는 요청 당 캐시 저장소이다.

그래서 더 많은 파기 후에 다음 코드를 발견했습니다.

internal static IDictionary<UnityPerWebRequestLifetimeManager, object> GetInstances(HttpContextBase httpContext) 
{ 
    IDictionary<UnityPerWebRequestLifetimeManager, object> instances; 

    if (httpContext.Items.Contains(Key)) 
    { 
     instances = (IDictionary<UnityPerWebRequestLifetimeManager, object>) httpContext.Items[Key]; 
    } 
    else 
    { 
     lock (httpContext.Items) 
     { 
      if (httpContext.Items.Contains(Key)) 
      { 
       instances = (IDictionary<UnityPerWebRequestLifetimeManager, object>) httpContext.Items[Key]; 
      } 
      else 
      { 
       instances = new Dictionary<UnityPerWebRequestLifetimeManager, object>(); 
       httpContext.Items.Add(Key, instances); 
      } 
     } 
    } 

    return instances; 
} 

이것은 내가 이해할 수없는 마술이 일어나는 부분입니다. 나는 Unity가 각각의 요청에 의존성 주입을하기 위해 사용한다고 생각한다. 내 프로젝트에서 나는 Ninject를 사용하고 있으며 어떻게 동일한 결과를 얻을 수 있는지 궁금합니다.

Ninject의 InRequestScope는 UnityPerWebRequestLifetimeManager와 같은가요? 나는 또한 어떤 클래스/메소드가 어떤 인터페이스에 바인딩되어 있는지 궁금해한다. HttpContext.Items는 각 요청을 파괴하기 때문에 사용자 객체가 손실되는 것을 어떻게 막을 수 있습니까?

어쨌든 긴 질문이므로 적절한 방향으로 밀어 넣은 것에 대해 감사드립니다.

답변

0

Ninject에서 기술 특정 확장 (Ninject.Web 또는 Ninject.Web.Mvc)을 선택하고 InRequestScope를 사용하여 '.Items 컨텍스트'의 내용을 관리합니다. 그들은 요청이 끝나면 Disposed를 받게되고 이후 요청시 필요에 따라 새로 처리됩니다.

그것은 확실히 않을만큼 코드 또는 IMO 인용하고있는 물건의 일부처럼 복잡 : Kigg와 통일에 대한 몇 가지 정보를 읽고 지금은 코드의 마지막 부분은 무엇 확실하지 않다 D

+0

. 나는 그들이 요청들 사이에 User 객체를 유지한다는 것에 대해서도 잘못 생각한다. 그들은 HttpContext.Items 그래서 그들은 각 요청에 대해 한 번만 데이터베이스를 호출해야합니다 저장할 것 같아요. – Pickels

+0

항목이 요청 사이에 있지 않습니다. 세션에서만 수행 할 수 있습니다. 항목은 예를 들어 비동기 작업을 수행하고 다른 스레드로 이동하는 경우입니다. 단일 HTTP 요청을 처리하는 여러 단계 사이에 물건을 저장하는 곳입니다. (따라서 InRequestScope를 Items와 비교 함) –