2010-06-16 8 views
2

NHibernate와 Fluent NHibernate를 사용하여 프로젝트를 개발하기 시작했는데 혼란 스럽습니다. 프로젝트가 다음 달에 더 복잡해질 것이므로 코드를 Persistence Layer 및 Business Logic 레이어와 같은 논리적 레이어로 구조화하고 싶습니다.NHibernate 아키텍쳐와 비즈니스 로직

나는 논리와 유효성 검사가 포함 된 Patient라는 비즈니스 개체를 가지고 있습니다.

  1. 환자 클래스를 Fluent NHibernate 매핑 클래스로 매핑해야합니까?
  2. 또는지도 클래스가 PatientDAO 및 Patient 클래스와 같은 일부 데이터 액세스 개체에 맵핑하면 PatientDAO가 사용됩니다.

1 인 경우 비즈니스 로직 계층과 지속성 계층이 동일하지 않습니까? 2, 두 레이어를 별도의 프로젝트가 있다면 BL 프로젝트에 Patient 객체가 포함되어 있고 IPatientDAO와 PL에는 PatientDAO 객체가 있어야합니까?

아니면 완전히 잘못하고 있습니까? :-)

답변

3

Fluent NHibernate를 사용하여 엔터티를 매핑해야합니다. 데이터베이스 구조에서 개체 모델로 매핑하는 곳이기 때문에입니다.

DAO는 개인 취향의 문제입니다. 일반적으로 사람들은 일종의 DAO를 사용하기를 좋아합니다 (요즘에는 리포지토리라고 부르기를 좋아하지만). 이 클래스들은 Hibernate Session을 이용하여 데이타베이스와 데이타를주고 받는다. 일반적으로 이것들과 함께 작업하는 현재의 방법은 Get<T>(int id), GetAll<T>(), '삭제() type methods defined to handle CRUD ops, with T'가 엔티티 유형 인 일반 인터페이스를 정의하는 것입니다.

그러나 프리젠 테이션 코드에서 ISession을 직접 사용할 수도 있습니다. 이미 데이터 읽기/쓰기를위한 추상화를 제공하고 있기 때문입니다. 이 경로를 간다면 NHibernate를 앱의 나머지 부분에 노출 시키지만 한 수준의 추상화를 제거 할 수도 있습니다.

Hibernate는 당신의 영속 계층의 95 % -100 %입니다. 자신의 추상화를 추가하여 자신을 행복하게 만드는 API를 만들 수는 있지만 이는 전적으로 귀하에게 달린 것입니다.

+0

답변 해 주셔서 감사합니다. 엔티티에는 비즈니스 로직과 유효성 검사가 포함되어 있습니까? 그렇다면 Active Record (데이터베이스 테이블이나 뷰의 행을 래핑하고 데이터베이스 액세스를 캡슐화하고 해당 데이터에 도메인 논리를 추가하는 개체) 패턴을 사용하는 것 같습니다. Fowler는 PEAA에서 설명한 패턴입니다. 도메인 논리가 복잡하고 Folwer의 책을 읽은 후에 Data Mapper와 함께 도메인 모델 (동작 및 데이터를 모두 포함하는 도메인의 개체 모델)을 사용하는 데 더 관심이 있습니다. 어떻게 상속, 다형성 등을 사용하여 도메인 모델과 함께 NHibernate를 사용할 수 있습니까? – moonz

+0

지속성 계층에있는 NHibernate 파일은 클래스 맵 파일과 일부 구성 파일보다 훨씬 짧습니다. 클래스 맵 파일은 비즈니스 계층에 맵핑되는 파일에 가능한 한 근접해야한다고 읽었습니다. – moonz

+0

여러 주석에서이 작업을해야 할 수도 있습니다. 그러나 NHibernate는 본격적인 도메인 모델을 매우 쉽게 사용할 수 있도록 지원합니다. 사실, 참조하는 엔티티의 ID를 추적하기 위해 여러 속성을 추가하지 않고도 엔티티 참조를 설정하는 등의 작업을 수행 할 수 있으므로 더 깨끗한 솔루션 중 하나입니다. 또한 엔티티 클래스의 상속을 지원하며 (Fowler에서 언급 한 것처럼) 사용할 다형성 테이블 매핑 스타일을 지정할 수 있습니다.해당 엔티티에 적합한 논리를 엔티티에 입력하십시오. – ckramer

관련 문제