1

WinForms 응용 프로그램에 비즈니스 엔터티 Order가 있고 엔터티가 여러 뷰에서 사용되며 각 뷰가 응용 프로그램에서 다른 도메인 또는 유스 케이스를 처리한다고 가정합니다. 예를 들어, 하나는 주문을 관리하고 다른 하나는 주문을 파고 추가 데이터를 표시합니다.비즈니스 개체 : 개인 인스턴스 VS 단일 인스턴스

nHibernate (또는 다른 ORM)을 사용하고 뷰 당 (또는 db 작업 당) 하나의 세션/dataContext를 사용하면 동일한 Order에 대해 두 개의 다른 인스턴스를 얻게됩니다 (orderId = 1이라고 가정 해 봅시다).). 기능적으로 동일한 엔티티이지만 기술적으로 두 개의 다른 인스턴스입니다. 네, 같음/GetHashcode를 구현하여 "같아 보이도록"만들 수 있습니다.

엔티티 당 하나의 인스턴스 대 하나의보기 또는 개인 케이스 당 개인 인스턴스로 이동하는 이유는 무엇입니까?

단일 인스턴스를 사용하면 INotifyPropertyChanged 이벤트를 공유하고 추가 (비 지속성) 데이터를 공유 할 수 있다는 장점이 있습니다.

각보기에서 개인 인스턴스를 사용하면보기 수준에서 실행 취소 기능의 유연성을 얻을 수 있습니다. 위의 예에서 사용자는 주문 세부 정보를 변경하고 변경 사항을 저장하지 않을 수있는 유연성을 제공 할 수 있습니다. 여기서 뷰/유스 케이스 간의 동기화는 데이터 지속성 레벨에서 발생합니다.

당신의 주장은 무엇입니까?

답변

2

Equals/GetHashCode 개의 메소드를 구현해야합니다. ORM을 사용할 때 권장되는 방법입니다.

또한 일반적으로 "단일보기, 하나의 세션" 만트라로 계속 사용해야합니다. 보기가 변경되거나 초점이 없어지면 모든 객체를 유지합니다. 당신이 이라면 실제로은 여러보기를 통해 엔티티를 공유해야합니다 ... 물론 하세요! 가끔은해야합니다.

다시 한번 우리는 엔터티 및 행 유형의 관점에서 비즈니스 개체를 볼 때 "개체"수준의 평등과 관련해서는 안됩니다.

+0

흥미 롭습니다.하지만 왜 equals/gethashcode를 구현해야합니까? 즉, ORM 빌더가 엔티티의 단일 인스턴스를 반환하지 않고 .NET에서 평등을 처리하게하는 이유는 무엇입니까?내가 목표로하는 것은 시나리오에 기반한 베스트 프랙티스입니다. 단순한 방식을 받아들이는 것이 아니라 사적인 인스턴스를 사용하는 것이 더 낫습니다. – tofi9

+1

대부분의 경우 ORM *은 * 할 수 없기 때문에 * . ** 당신이 ** 객체의 인스턴스를 생성한다고 가정 해 봅시다. 그런 다음 데이터베이스를 유지합니다. 그런 다음 ORM을 사용하여 동일한 객체를 DB에서 꺼냅니다. ORM은 당신이 그 객체를 더 일찍 인스턴스화했다는 것을 어떻게 알 수 있습니까? 그것이 아는 전부는 캐시 된 것입니다. 그리고 많은 경우 프록시가 객체에서 사용되어 변경된 속성을 추적하는 데 도움을줍니다. 이제는 객체간에 "비즈니스 객체"의 동등성을 비교할 수있는 방법이 있기 때문에 구현해야합니다. 그들이 똑같은 경우 정말로 신경 씁니까? 그렇게한다면, 자신의 캐시를 유지하십시오. – snicker

0

나는 ORM에 대해 말할 수는 없지만, 자신의 질문에 어느 정도 대답했다고 생각합니다. 두 가지 옵션에 대해 찬반 양론을 제공했습니다. 둘 다 절대적인 측면에서 옳고 그른 것은 아닙니다.

옵션은 상황에 따라 옳고 그름이 다릅니다. 공유 정보가 단일 공유 인스턴스를 사용하는 것이 타당하지만, 실행 취소가 더 중요한 경우 다중/개인 인스턴스를 사용하십시오.

NFR (또는 "illities") 및 시스템 컨텍스트에 대해 생각해보십시오. 예를 들어, 성능이 핵심 관심사이고 사용자 기반이 커질 것이라는 것을 알고 있다면 다른 옵션보다 하나의 옵션을 제안하거나 다시 처음부터 다시 생각하도록 강요 할 수 있습니다.

마지막으로 "주문"이 있습니까? 다른 엔터티는 어떻게 처리됩니까?
또는없는 경우 무엇을 할 때 어떤 일이 발생합니까? 그게 당신 건축에 어떤 영향을 주겠습니까?

관련 문제