2012-08-29 3 views
0

StructureMap을 사용 중이며 HybridHttpOrLocalThreadStorage 수명주기의 세션을 구성했습니다. 새로운 세션이 생성되어 요청별로 컨트롤러에 주입됩니다.올바른 세션 (RavenDB/NHibernate) 처리 - IoC 및 웹 응용 프로그램

이제 제가 처한 문제는 폐기에 관한 것입니다. 여러 가지 접근법을 제시하는 기사를 읽었습니다. 어떤 사람들은 컨트롤러에서, 리포지토리에서, HTTP 모듈에서, 그리고 다른 사람들은 Application_EndRequest() 핸들러에서 그것을 수행했습니다. 비판은 SRP 위반에서부터 '대상을 만드는 것이 그 처분에 책임 져야한다'라는 것부터 시작되었습니다. 왜 -

  • 일반적인 방법은 수동으로 세션을 처리했다 :

    그래서 결론은이다? 특정 컨테이너의 수명주기를 관리하기 위해 컨테이너를 이미 구성했습니다. IoC (IoC)에서 관리해야하지 않습니까?

  • 폐기 처분을 위해 Application_EndRequest()에서 처리하는 것이 가장 좋습니다.

예를 들어, this article은 길이가 하나의 사용 가능한 방법을 설명하지만 기사 자체는 2.5 년 이상입니다. 아마도 새로운 버전의 StructureMap은 그러한 구현의 대부분을 쓸모 없게 만들 것입니다.

+1

HTTP 요청이 끝나면 StructureMap은 세션을 폐기해야합니다. 이것이 해당 라이프 사이클의 목적입니다. 이는 Application_EndRequest에 세션을 삭제하는 것과 같습니다. – eulerfx

+1

관련 : http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why – Steven

+0

@eulerfx : 그럴까요? 그래서, 내가해야 할 일은 내 컨트롤러에 Session을 전달해야하고, 데이터와 함께해야만하는 것은 무엇이든해야합니다. SaveChanges를 호출하고 종료하십시오. 구조지도는 나머지를 할 것인가? 다른 사람들이 컨트롤러, 저장소, 모듈 등에서 수동으로 세션을 폐기 한 것을 읽은 후에는 그렇게 확신 할 수 없었습니다. 확인할 방법이 있습니까? – user981375

답변

2

RavenDB .net 클라이언트를 사용하는 경우 DocumentStore와 DocumentSession을 사용하게됩니다. 이 두 객체 모두 백그라운드에서 상당한 양의 작업을 수행합니다. 한 가지 언급은 로컬 캐싱입니다. 일을 깨끗하고 효율적으로 유지하려면 각 세션에서 작업이 완료되면 session.dispose()를 호출해야합니다. documentStore.Dispose()는 응용 프로그램이 종료 될 때 호출되어야합니다.

+0

이것은 아주 명확합니다. 'DocumentStore' (싱글 톤)과'DocumentSession' (요청 당)을 구성하는 데 아무런 문제가 없습니다. 내 질문은 작업이 완료된 후 적절하게'DocumentSession'을 처리하는 방법에 관한 것입니다. – user981375

관련 문제