2010-04-26 4 views
13

나는 나머지 부분을 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) 인스턴스. 대신 RepositoryNHibernateHelper.CurrentSession 속성의 ISession으로 작동하는 정적 클래스이며 일반 메서드를 통해 기능을 노출합니다.

그래서 기본적으로 두 개의 매우 게으른 싱글 톤으로 끝나게되었습니다.

궁금한 점이 무엇이라고 생각하십니까? 그것은 유효한 사고 방식입니까 아니면 완전히 여기서 추적 할 수 있습니까?

편집 :
내가 NHibernateHelper 클래스 그렇게 거의 눈에 보이지 않는 저장소의 소비자, 내부에 있음을 지적한다.

다른 아이디어는 솔루션에 종속성 주입을 도입하려면 IDataProvider이라는 인터페이스를 만들고 Repository 클래스에 대한 첫 번째 호출시 인스턴스를 인스턴스화하는 것입니다. (단, 실행 코드는 컨텍스트의 개념 돌 수 있어야합니다.)

편집 2 : 많은 사람들이 내 생각처럼,하지만 그것에 대해 너무 적은 의견이 여전히 것 같다
답변.
이것이 NHibernate를 사용하는 올바른 방법이라고 가정 할 수 있습니까? : P

답변

2

샤프 아키텍쳐 (Sharp Architecture)는 가치있는 것이 무엇인지 당신이 제안하고있는 것을 어느 정도 수행하고 있습니다. HTTP 요청 당 하나의 세션 (더 정확하게는 HTTP 요청 당 데이터베이스 당 하나의 세션)을 제공합니다. 귀하의 접근 방식은 확실히 유효하며 요청 당 하나의 세션을 제공합니다. 차라리 정적 리포지토리와 도우미 클래스를 사용하여 DI를 통해 SharpArch의 클리너 OO 접근 방식을 선호합니다.

+0

그래,하지만 내 솔루션은 사용하기 쉬운 구문을 사용하고 있으며 객체 인스턴스화 측면에서 오버 헤드가 적어 메모리 사용량이 적다. – Venemo

1

ASP.NET/Windows Forms 응용 프로그램이 혼합되어 있으며 저장소 생성자를 통해 수동 종속 삽입을 수행하는 것이 가장 좋은 해결책입니다. 즉, 모든 저장소 클래스에는 ISession이 필요한 단일 공용 생성자가 있습니다. 이를 통해 응용 프로그램은 작업 단위 및 트랜잭션 경계를 완벽하게 제어 할 수 있습니다. 간단하고 효과적입니다. 또한 세션 팩토리를 구성하고 정규 또는 컨텍스트 세션을 여는 메소드를 제공하는 아주 작은 NHibernate 도우미 어셈블리가 있습니다.

내가 S # arp Architecture에 대해 좋아하는 많은 것들이 있으며 어떻게 작동하는지 연구할만한 가치가 있다고 생각하지만 내 취향에 따라 과도하게 설계되었다.

+0

+1, 나는 또한 그것을 over-architected 발견. 그러나 정적 저장소는 훨씬 간단하기 때문에 그것이 내가가는 길이라고 생각합니다. – Venemo

관련 문제