2010-06-05 2 views
1

현재 우리는 NHibernate를 사용하여 비즈니스 객체를 데이터베이스 테이블에 매핑합니다. 비즈니스 개체는 비즈니스 규칙을 적용합니다. 설정된 접근자는 해당 속성에 대한 계약을 위반할 경우 그 자리에서 예외를 throw합니다. 또한 속성은 다른 객체와의 관계를 강화합니다 (때로는 양방향!). Hibernate가 데이터베이스에서 객체를로드 할 때마다 (예 : ISession.Get (id)가 호출 될 때), 매핑 된 속성의 set 접근자는 데이터를 객체에 넣는 데 사용됩니다.NHibernate와 매핑해야 할 클래스는 무엇입니까?

애플리케이션의 중간 계층이 비즈니스 로직을 시행한다는 것이 좋습니다. 나쁜 점은 데이터베이스가 그렇지 않다는 것입니다. 때로는 쓰레기가 데이터베이스로 들어가는 것을 발견합니다. 쓰레기가 응용 프로그램에로드되면 bails가 발생합니다 (예외가 발생 함). 때로는 아무것도 할 수 없기 때문에 보석금을 분명히 내야 할 수도 있지만, 계속 일할 수 있다면 어떨까요? 예를 들어 실시간 보고서를 수집하는 관리 도구는 관리자가 (잠재적 인) 문제를 수정하는 대신 불필요하게 실패 할 위험이 높습니다.

나에게는 지금 예제가 없다. 그러나 어떤 경우에는 NHibernate가 관계 (특히 bidi)를 적용하는 "front door"속성을 사용하게하면 버그가 발생한다.

최상의 솔루션은 무엇입니까?

현재, 나는, 속성별로, 단지 NHibernate에 대한 "뒷문"를 생성합니다 :

public virtual int Blah {get {return _Blah;} set {/*enforces BR's*/}} 
protected virtual int _Blah {get {return blah;} set {blah = value;}} 
private int blah; 

내가이 얻는 방법을 설명하는 C# 2 (NO 기본 속성) 위를 보였다 우리는 기본적으로 3 층, 또는 전망, 어쩌구! 이 방법이 효과적 일지는 모르겠지만, BL이 앱 전체에 대한 공용 (공용) 인터페이스와 데이터 액세스 계층에 대한 또 다른 (보호 된) 인터페이스를 제공해야하므로 이상적이지는 않습니다.

추가 문제가있다 : 내 지식으로, NHibernate는 BL의 속성 이름과 엔티티 모델의 속성 이름을 구분할 수있는 방법을 제공하지 않는다. 질의, 예를 들어 HQL을 통해 - 당신이 Hibernate에게 속성의 이름 (문자열)을 줄 때마다). 이것은 처음에는 BR의 일부 속성 Blah에 문제가 없으므로 O/R 매핑에서 참조 할 수 있지만 나중에 문제가되는 BR을 추가해야하므로 문제가됩니다. O'Blah 속성을 사용하도록 O/R 매핑을 변경해야합니다.이 속성은 "Blah"(문자열 프로그래밍에 공통적 인 문제)를 사용하여 기존 쿼리를 모두 손상시킵니다.

누구나 이러한 문제가 해결 되었습니까?!

+2

그것은 분명하지 않다. 나는 그 시나리오 (NHibernate가 관련되어 있는지 여부에 관계없이)에 대한 일반적인 해결책이 없다고 생각한다. 당신은 아마 끊임없이 잘못된 데이터를 찾고 데이터베이스를 폴링하고 어떻게 든 NHibernate가 그것을로드하기 전에 그것을 교정하려고 시도 할 수 있습니다. –

+0

그냥 관련 토론을 찾았 : http://stackoverflow.com/questions/129773/nhibernate-map-to-fields-or-properties – apollodude217

+0

@ 마이클 : 좋은 질문/의견.일반적으로 이전에 존재하는 데이터가 비즈니스 요구 사항을 충족시키지 못하는 레거시 애플리케이션입니다 (나는 우리가 정리해야한다는 것을 알고 있습니다). 또는 다른 레거시 앱이 불량 데이터를 가져올 수있는 곳입니다. – apollodude217

답변

3

대부분의 아키텍쳐가 문제가있는 것으로 밝혀졌지만,이 문제를 다루는 일반적인 방법은 Hibernate가 setter 대신 backing field를 사용하도록하는 것입니다.

위 예에서 추가 보호 속성을 정의 할 필요가 없습니다. 그냥 매핑이 사용 :이 문서에 설명되어

<property name="Blah" access="nosetter.lowercase"/> 

당신이 당신의 데이터베이스에 들어가기에서 잘못된 데이터를 방지 할 수없는 이유, http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-property. (표 5.1 액세스 전략)

+1

사실 이것은 Hibernate의 기본 액세스 전략입니다. 데이터베이스에서 읽을 때 시행하지 말고 그냥 들어 있어야합니다. 어떤 이유로 NHibernate 사람들은 부동산 액세스 전략에 동의하지 않고 옹호/추천하지 않습니다. –

+1

@Fried 그것은 setter가 일반적으로 .NET/NHibernate로 규칙이 시행되는 곳이 아니기 때문일 수 있습니다. 실제로 대부분의 영속 ​​엔티티는 자동 특성을 사용하므로 getter/setter 본문이 생성됩니다. –

+0

의견을 보내 주셔서 감사합니다. @Diego, 이 솔루션을 사용하면 C# 2 코드 (속성 및 필드)의보기가 Blah로 축소됩니다. 그러나 C# 3에서는 두 개의 레이어 (속성 및 필드)가 필요합니다. 즉, 기본 속성이 될 수 없습니다. 아직 구현할 비즈니스 로직이 있는지 여부에 관계없이 손으로 코딩해야합니다. 나는 정확하게 이해합니까? – apollodude217