데스크톱 애플리케이션에서 NHibernate에 대한 세션 관리 전략은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/90530

문제

HttpContext와 같은 명확한 결합을 활용할 수 없기 때문에 데스크톱 애플리케이션에서 세션을 관리하는 것이 훨씬 더 어렵다는 것을 알았습니다.그렇다면 전체 애플리케이션에 대해 하나의 세션을 열지 않고 지연 로딩을 활용하기 위해 세션 수명을 어떻게 관리합니까?

도움이 되었습니까?

해결책

나는 그것이 당신의 물건의 디자인에 달려 있다고 생각합니다.객체별 수준에서 지연 로딩을 적용할 수 있으므로 세션 관리를 고려할 때 이러한 사실을 활용할 수 있습니다.

예를 들어, 데이터가 풍부하고 로드가 지연되는 개체가 많이 있고 이에 대한 그리드/요약 보기와 세부 정보 보기가 있습니다.그리드 요약 보기에서는 객체의 지연 로드 버전을 사용하지 않습니다.해당 데이터를 표시하기 위해 대리 개체를 사용하는데 해당 대리 개체는 지연 로드되지 않습니다.

반면에 사용자가 보기/편집을 위해 해당 레코드를 선택하고 개체의 여러 페이지로 구성된 세부 정보 보기에 들어가면 해당 개체에 지연 로딩이 적용됩니다.이제 데이터는 요청 시에만 표시되는 세부 정보에 따라 지연 로드됩니다.이렇게 하면 지연 로딩을 위해 열려 있는 세션의 범위는 세부 정보 보기가 사용되는 동안에만 지속됩니다.

다른 팁

Ayende는 최근에 글을 썼습니다. MSDN의 주제에 대한 훌륭한 기사.

앞서 말했듯이 HttpRequest의 경계를 사용할 수는 없지만 데스크톱 애플리케이션에서 "HttpRequest"가 무엇인지 이해할 수 있습니다.

설명하겠습니다.일반적으로 HttpRequest는 작업에 대한 컨트롤러가 되며 세션을 해당 특정 작업으로 제한합니다.이제 데스크톱 응용 프로그램에서 "컨트롤러"(이벤트)는 더 작을 수 있지만 @Jon이 말했듯이 창은 쉽게 경계를 나타낼 수 있습니다.거기에 있는 것들로 작업하고 세션에 포함시키세요.

어쩌면 명령 패턴 설정을 생각해 볼 수도 있습니다.각각의 중요한 이벤트는 명령을 제공하고 실행하며 실행합니다.기본 AbstractCommand.Execute() 구현은 세션 초기화, 트랜잭션 래핑, 구체적인 SomeCommand._Execute() 구현 호출 및 모든 작업 닫기를 담당합니다.

어쨌든, 이는 객체를 로드하고 일반 인스턴스만 처리해야 하기 때문에 지속성에 무관하지 않습니다(여기서는 특히 지연 로드를 언급하고 있습니다).

그렇지 않으면 일종의 자동 열기/자동 닫기 동작을 구현하는 것이 가능합니까?이는 지연 로드 트리거와 같은 암시적 경우에도 상위 계층의 쿼리 요구에 민감하게 반응하는 지속성 계층을 만들어 수행해야 합니다.연결을 닫는 것과 관련하여 DB 비활성의 지정된 시간 초과(10초?) 후에 지속성 계층이 닫힐 수 있습니다.나도 알아요, 이건 날카롭지 않아요.그러나 실제로는 더 높은 계층의 지속성을 불가지론하게 만듭니다.

감사합니다, 마르셀로

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top