2009-07-11 3 views
1

제품 이름을 표시하는 간단한보기와 제품이 단종되었는지 여부를 가정 해 보겠습니다. Northwind 데이터베이스에서 데이터를 추출합니다. NHibernate와 함께 간단한 Model View Pattern과 DAO Pattern을 사용하고 있습니다. 폼이로드 될 때로드 버튼과 저장 버튼이있는 UI가 있습니다. 코드 뒤에있는 코드보다로드 버튼을 누르는 경우 데이터를로드하기 위해 호출자를 내 Presenter에 전달하기 만하면됩니다. Preseneter는 DAO를 호출하여 데이터를 가져 와서 뷰로 데이터를 채 웁니다. 저장 버튼을 눌렀을 때보다. 다시 내 코드 뒤에 발표자에게 전화를 전달합니다. 발표자는 낙천적 동시성, 변경 내용 추적 등을 수행하기 위해 Load에서 작성된 세션 객체를 가져야합니다.Nhibernate 및 ISession

내 질문은 변경 추적 및 낙관적 동시성을 수행 할 수 있도록 내 Session 객체를 어디에서 작성합니까?

답변

0

HTTP는 상태 비 저장입니다. 작업 단위 (UOW)는 서버 측에만 존재합니다. '로드'를 클릭하면 UOW는 레코드를 검색하고 뷰 모델에 매핑하기 만하면됩니다. '저장'및 작업 단위는로드 과정을 거치지 않고 브라우저에서 편집 한 다음 서버로 돌아 가기보다는 서버에 충돌 할 때 시작됩니다.

구현 (당신의 경우 ASP.Net 세션 객체)에서 메모리에 ISession을 유지하면 안된다. 메모리와 관리되지 않는 ADN 리소스를 소모하는 확실한 방법이다. 어떤 사람들은 BeginRequest에서 HTTP 컨텍스트와 ISession을 연결하고 end_request에 처 리하기로 결정한 다양한 UOW 예제가있다. 물론 더 세부적 일 수는 있지만 모든 경우에 결코 존재할 수 없다.

단순한 시스템에서는 '저장'을 누르면 ID (숨김 필드 또는 숨김 필드)를 사용하여 데이터베이스에서 제품을 가져 와서 Request.Form에서 속성을 설정 한 다음에 업데이트해야합니다 데이터베이스

동시성에 관해서. 당신은 당신이 저장을 쳤을 때

<input type="hidden" name="version" value="12"/> 

그런 다음, 데이터베이스에서 제품을 당겨 숨겨진 필드에 타임 스탬프 또는 증분 버전을 기록하는 경우는 Request.Form 경기에서 버전 번호가 다음 저장하고 있음을 확인, 마지막으로 검색 한 후 데이터가 변경되었다고 사용자에게 반환하지 않으면 계속 하시겠습니까? NHibernate는 timestamp/version 필드를 가지고 있기 때문에 업데이트가 기본적으로 where 절을 실제로 조회했을 때 비교가 이루어 지므로이 인스턴스에서는 커밋 변경 순간을 고려합니다.

더 정교하고 세련된 방법이 있지만 일반적으로 asp.net 세션 개체에서 ISession을 고수 할 수는 없으며 /하지 않아야합니다.

+0

웹 응용 프로그램에 대해 생각하지 않습니다. winform appplication에 대해 궁금합니다. 미안, 내 질문에 그걸 지정하지 않았다는 사실을 알았어 – codemnky

+0

내 잘못이야. 아마 당신의 DB 작업은 이것이 잘되어야 스레드되지 않습니다. 만약 당신이 감히 싱글 톤 매니저를 사용합니다. –

+0

어플리케이션의 수명 동안 하나의 세션을 만드는 것이 효과가 있다는 것을 증명할 수는 있지만 대부분의 nHibernate '전문가'는 권장하지 않습니다. 예외가 발생하거나 트랜잭션을 롤백해야하는 경우 캐싱 및 잠재적 문제와 관련된 메모리 사용 문제가 있다고 생각합니다. –