2009-03-16 3 views
8

나는 몇 가지 기본적인 Get/Save/Delete 메소드를 정의하는 저장소 클래스를 가지고있다. 이것들 안에서, 나는 NHibernate를 사용하여 사업체에 대한 작업을 수행한다. 예를 들면 다음과 같습니다.저장소 모델에 NHibernate를 사용하는 가장 좋은 방법

그러나 사용자 클래스에는 일부 개체 및 일부 개체 모음이 있습니다.이 개체는 게으르며로드하려고합니다. 물론 ISession은 리포지토리 내에 만들어지고 처분됩니다. 그 이유는 외부에서 이러한 속성에 액세스하려고 할 때 "프록시를 초기화 할 수 없습니다 - 세션이 없습니다"라는 오류가 발생하는 이유입니다.

리포지토리를 사용할 때 지연로드를 비활성화하는 유일한 방법은 무엇입니까? 아니면 비즈니스 계층의 세션에 세션을 가져 오는 것이 가능합니까 (아니면 그냥 어리석은가요?)?

저장소 모델이 마음에 들었고 NHibernate가 (초기의 많은 좌절감을 빚어서 작동하도록 만들었습니다.) 성장하고 있습니다. 그래서 당신이 함께 사용하는 데있어 가장 좋은 방법은 무엇입니까?

저는 NHibernate와 저장소 모델에 꽤 익숙합니다 (우리는 여전히 VB6를 주로 사용합니다!), 어리석은 질문 일지라도 용서하십시오. 감사.


@mookid : 고마워요, 정말 도움이 되긴하지만 좀 더 길게 열어 둘 수 있습니다. WCF 웹 서비스의 백엔드이며 모든 함수가 호출 별 컨텍스트가되므로 호출 당 세션 수명이 좋을 것입니다. 비지니스 계층에서 그런 일을하는 법을 모르겠다면 비즈니스 객체가 어떤 NHibernate 클래스와도 직접적으로 인터페이스하지 않아도되는 것이 이상적이다. 나는 최소한 NHibernate 세션을위한 어떤 종류의 래퍼 (wrapper)가 그것을 추상화한다고 생각한다. 흠, 당신은 나를 올바른 길에 올려 놓았다.


여기에 핵심 단어처럼 보이는 자원의 톤이 NHibernate에 관련하여 웹에 존재하는 "작업 단위"입니다. 특히 Rhino Commons에서 Ayende's implementation을 찾고, 그의 App Architecture 웹 캐스트는 매우 유익한 (no. 9 at Hibernating Rhinos)입니다. 처음에는 사업부에 "Unit of Work"를 넣었지만 걱정거리가 혼합 되었기 때문에 혼란 스러웠습니다. but I was soon corrected.

답변

12

작고 간단한 프로젝트의 경우 ISession을 만들고 리파지토리 내에 명시 적으로 삭제하는 것이 좋습니다. 당신이 알았 듯이, NHibernate가 지원하는 멋진 기능들을 사용하기를 원할 때 짧다.

세션의 라이프 스타일을 리포지토리 외부의 항목으로 제어해야합니다. ASP.NET 웹 응용 프로그램을 수행하는 경우 웹 요청이 지속되는 동안 현재 요청 (정확하게 기억한다면 HttpContext.Current.Items)에 세션을 저장 한 다음 요청이 끝나면 커밋하고 처리 할 수 ​​있습니다 (또는 롤백 예외가 발생하면).

ASP.NET 응용 프로그램에서 세션의 라이프 스타일을 제어하는 ​​가장 좋은 방법은 모르겠지만 각 요청의 시작과 끝 부분에서 코드를 호출 할 수있는 방법이 있어야합니다. ASP.NET MVC에서는 OnActionExecutingOnActionExecuted 메서드를 오버라이드 한 기본 컨트롤러에서 모든 컨트롤러를 파생시킴으로써 쉽게 수행 할 수 있습니다.

관련 문제