2010-04-02 5 views
0

나는 여기서 내가 곤경에 처해 있다고 생각한다. FluentNHibernate (ORM)/SQLite (file db)를 사용하여 처음부터 작성한 응용 프로그램이 있습니다. 나는 Unit of Work와 Repository Design 패턴을 구현하기로 결정했다. 나는 WPFS 윈도우 애플리케이션 (MVVM 사용)으로 시작하여 궁극적으로 웹 서비스/ASP.Net을 UI로 구현할 최종 게임에 관해 생각할 필요가있는 지점에 있습니다.FluentNHibernate 작업 단위/저장소 디자인 패턴 질문

이제 ORM 용 도메인 개체 (엔티티)를 만들었습니다. 그리고 지금은 ORM 외부에서 어떻게 사용해야하는지 모르겠습니다. 그것에 대한 질문은 다음과 같습니다.

  • MVVM의 모델로 ORM 엔터티 개체를 직접 사용해야합니까? 그렇다면 해당 비즈니스 개체 (예 : 특정 값이 양수이어야하고 다른 속성보다 커야 함)를 해당 개체 개체에 넣을 수 있습니까? 그것은 확실히 더 간단한 접근법이고, 지금 나는 기울고 있습니다. 그러나이 계획을 쓰레기가 버릴까요?
  • 위의 대답이 아니오라면 비즈니스 로직을 구현하고이를 MVVM의 모델로 사용하는 새로운 클래스 집합을 만들까요? 모델 객체와 엔티티 객체 사이의 전환을 어떻게 다루겠습니까? 나는 타입 변환기 구현이 여기에서 잘 작동한다고 생각한다.

답변

3

질문의 첫 번째 부분에 대답하려면 비즈니스 로직 및 유효성 검사를 수행해야합니다. NHibernate의 요점은 영속성을 알지 못하도록 엔티티를 디자인하게하는 것입니다. 즉, 지속성을 염려하지 않는다면 가능한 한 항상 엔티티를 디자인해야합니다. 당신이 곧 알아낼 것입니다 (당신은 게으른 로딩을 지원하기 위해 당신의 프로퍼티를 가상으로 만들 필요가있을 것입니다. 그리고 당신이 NHibernate Validator를 사용하기를 원한다면 당신은 밸리데이션 속성으로 프로퍼티를 장식 할 것입니다). 대부분 NHibernate는 자신의 길을 벗어나기 위해 좋은 일을한다.

엔티티를 모델로 사용할지 여부는 모델에 대한 리뷰가 혼합되어 표시됩니다. 이상적으로는 별도의 viewmodel 클래스를 만들고 엔티티에서 뷰 모델로 매핑하여 뷰에서 필요한 최소한의 정보에만 액세스 할 수 있도록하는 것이 좋습니다. 이것은 또한 N+1 access issues을 막는 데 많은 도움이됩니다. 그러나 이렇게하는 것은 종종 큰 고통입니다. 허락하면, 과 같은 도구를 사용하면 엔티티 속성을 뷰 모델로 쉽게 이관 할 수 있습니다.

+0

나는 AutoMapper에 대해 몰랐다. 고마워! 이 클래스를 사용하면 별도의 ViewModel 클래스를 만들고 AutoMapper를 사용하여 해당 속성을 Entity 클래스 속성에 매핑하는 것이 효율적이고 효율적입니다. 간단한 납작한 작업 (또는 작은 영사)이 가능합니다. 내가 아는 두 번째 부분은 까다로 우며 단단한 NHibernate/작업 단위 디자인 패턴 지식이있는 사람이 필요합니다. 찔러보고 싶다면 고마워! – Echiban

+0

네, NHibernate에 대해 충분히 정통하지 않아서 어떻게 설정하는 것이 최선인지 알려주지 않습니다. ISessionFactory, Session, ITransaction을 설정하는 데는 여러 가지 방법이 있습니다. 개인적으로, 저는 그것들과 직접 작업하고 Inversion of Control 컨테이너를 사용하여 Repository 클래스에 ISession을 전달하는 것을 좋아합니다. 지금까지 설정을 마치면 FluentNHibernate 문서가 꽤 희박하고 작업 단위를 추가하는 데 복잡성이 따르지 않으므로 필자는 FluentNHibernate 설명서를 사용하지 않을 것입니다. –

+0

나는 CodeCampServer (http://code.google.com/p/codecampserver/)를 추천한다. NHibernate, AutoMapper, IoC (StructureMap)를 사용하는 아주 좋은 구현이 있습니다 – Rookian