나는 나머지 부분을 StackOverflow 질문과 주제에 대한 블로그 항목 및 링크를 읽는 데 보냈다. 그들 모두는 매우 도움이되는 것으로 밝혀졌지만, 나는 아직도 그들이 내 질문에 대답하지 않는다고 느낀다.정적 저장소가 NHibernate를 사용하는 올바른 방법입니까?
그래서 간단한 웹 응용 프로그램을 개발하고 있습니다. 나중에 다른 솔루션에서 재사용 할 수있는 재사용 가능한 데이터 액세스 레이어를 만들고 싶습니다. 이 중 99 %가 웹 응용 프로그램입니다. 이 NHibernate 및 주변 패턴 중 일부를 배울 좋은 변명 것 같다.
- 내가 비즈니스 로직 계층은 데이터베이스의 내부 동작에 대해 아무것도 알고 싶지 않아,도 NHibernate에 자체 :
내 목표는 다음과 같습니다.
- 비즈니스 로직 계층에서 데이터 액세스 계층에 대한 가능한 최소한의 가정을 원합니다.
- 나는 가능한 한 단순하고 사용하기 쉬운 데이터 액세스 레이어를 원합니다. 이것은 간단한 프로젝트가 될 것이므로 어떤 것도 지나치게 복잡하게 만들고 싶지는 않습니다.
- 데이터 액세스 레이어를 가능한 한 방해가되지 않도록하고 싶습니다.
이 모든 것을 염두에 두어 인기있는 저장소 패턴을 사용하기로 결정했습니다. 이 사이트와 다양한 개발자 블로그에서이 주제에 대해 읽었으며 작업 패턴에 관한 몇 가지 정보를 들었습니다.
나는 또한 둘러보고 다양한 구현을 확인했습니다. (FubuMVC contrib 및 SharpArchitecture를 비롯한 일부 블로그에 포함). 이들 중 대부분은 동일한 원칙으로 작동한다는 것을 알았습니다. 저장소가 인스턴스화되고 트랜잭션이 시작될 때 인스턴스화되는 "작업 단위"를 만듭니다. 물건을 만들고, 커밋하고, 다시 처음부터 다시 시작하십시오. 따라서 Repository
당 하나의 ISession
인데 그게 전부입니다. 그런 다음 클라이언트 코드는 저장소를 인스턴스화하고, 저장소와 함께 처리 한 다음 처 리해야합니다.
이 사용 패턴은 가능한 한 단순한 필요성을 충족시키지 못하므로 다른 생각을하기 시작했습니다.
나는 NHibernate가 이미 "작업 단위"구현을 불필요하게 만드는 것을 발견했다. 그 것은 CurrentSessionContext
클래스이다. 세션 컨텍스트를 올바르게 구성하고 필요한 경우 정리를 수행하면 좋은 결과를 얻을 수 있습니다.
그래서, 나는이 함께했다 :
내가NHibernateHelper
이라는 내부 정적 클래스가 있습니다. 첫째,
CurrentSessionFactory
이라는 정적 속성이 있습니다. 첫 번째 호출시 세션 팩토리를 인스턴스화하고 정적 필드에 저장합니다. (한
AppDomain
하나당 한 충분합니다.) 더 중요한 것은
CurrentSession
정적 속성을 가지고 현재 세션 컨텍스트에 바인딩 된
ISession
이 있는지 확인하고 그렇지 않은 경우 하나 만들고 바인딩합니다. 현재 세션 컨텍스트에 바인드 된
ISession
을 반환합니다. (장치 테스트를 위해, I는
ThreadStaticSessionContext
구성되지만, 당
HttpRequest
그래서 번
ISession
)는
WebSessionContext
에 주로 사용되므로
, 이것은 원활하게 작동한다. ISession
을 만들고 바인딩 한 후 이벤트 처리기를 HttpContext.Current.ApplicationInstance.EndRequest
이벤트에 후킹하여 요청이 끝난 후 ISession
을 정리합니다.(물론 웹 환경에서 실제로 실행되는 경우에만 수행됩니다.)
따라서이 모든 설정을 사용하면 NHibernateHelper
이 항상 ISession
을 반환 할 수 있으므로 인스턴스화 할 필요가 없습니다 「작업 단위」가 올바르게 동작하는 리포지터리 (repository) 인스턴스. 대신 Repository
은 NHibernateHelper.CurrentSession
속성의 ISession
으로 작동하는 정적 클래스이며 일반 메서드를 통해 기능을 노출합니다.
그래서 기본적으로 두 개의 매우 게으른 싱글 톤으로 끝나게되었습니다.
궁금한 점이 무엇이라고 생각하십니까? 그것은 유효한 사고 방식입니까 아니면 완전히 여기서 추적 할 수 있습니까?
편집 :
내가 NHibernateHelper 클래스 그렇게 거의 눈에 보이지 않는 저장소의 소비자, 내부에 있음을 지적한다.
다른 아이디어는 솔루션에 종속성 주입을 도입하려면 IDataProvider
이라는 인터페이스를 만들고 Repository
클래스에 대한 첫 번째 호출시 인스턴스를 인스턴스화하는 것입니다. (단, 실행 코드는 컨텍스트의 개념 돌 수 있어야합니다.)
편집 2 : 많은 사람들이 내 생각처럼,하지만 그것에 대해 너무 적은 의견이 여전히 것 같다
답변.
이것이 NHibernate를 사용하는 올바른 방법이라고 가정 할 수 있습니까? : P
그래,하지만 내 솔루션은 사용하기 쉬운 구문을 사용하고 있으며 객체 인스턴스화 측면에서 오버 헤드가 적어 메모리 사용량이 적다. – Venemo