처음에는이 게으른 것처럼 보이지 않지만 다음 프로젝트의 코드 조각을 이해하는 데 어려움이 있다고 말하고 싶습니다. .Asp.net Mvc - Kigg : 요청간에 HttpContext.Items의 사용자 개체를 유지하십시오.
나는 소스 코드를 통과하고 있었고, 난 내가 만드는 중이라서 내 자신의 작은 프로젝트에 대한 유용한 것이 무엇인가를 알아 차렸다. 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는 각 요청을 파괴하기 때문에 사용자 객체가 손실되는 것을 어떻게 막을 수 있습니까?
어쨌든 긴 질문이므로 적절한 방향으로 밀어 넣은 것에 대해 감사드립니다.
. 나는 그들이 요청들 사이에 User 객체를 유지한다는 것에 대해서도 잘못 생각한다. 그들은 HttpContext.Items 그래서 그들은 각 요청에 대해 한 번만 데이터베이스를 호출해야합니다 저장할 것 같아요. – Pickels
항목이 요청 사이에 있지 않습니다. 세션에서만 수행 할 수 있습니다. 항목은 예를 들어 비동기 작업을 수행하고 다른 스레드로 이동하는 경우입니다. 단일 HTTP 요청을 처리하는 여러 단계 사이에 물건을 저장하는 곳입니다. (따라서 InRequestScope를 Items와 비교 함) –