내 WinForms 응용 프로그램에 비즈니스 엔터티 Order가 있고 엔터티가 여러 뷰에서 사용되며 각 뷰가 응용 프로그램에서 다른 도메인 또는 유스 케이스를 처리한다고 가정합니다. 예를 들어, 하나는 주문을 관리하고 다른 하나는 주문을 파고 추가 데이터를 표시합니다.비즈니스 개체 : 개인 인스턴스 VS 단일 인스턴스
nHibernate (또는 다른 ORM)을 사용하고 뷰 당 (또는 db 작업 당) 하나의 세션/dataContext를 사용하면 동일한 Order에 대해 두 개의 다른 인스턴스를 얻게됩니다 (orderId = 1이라고 가정 해 봅시다).). 기능적으로 동일한 엔티티이지만 기술적으로 두 개의 다른 인스턴스입니다. 네, 같음/GetHashcode를 구현하여 "같아 보이도록"만들 수 있습니다.
엔티티 당 하나의 인스턴스 대 하나의보기 또는 개인 케이스 당 개인 인스턴스로 이동하는 이유는 무엇입니까?
단일 인스턴스를 사용하면 INotifyPropertyChanged 이벤트를 공유하고 추가 (비 지속성) 데이터를 공유 할 수 있다는 장점이 있습니다.
각보기에서 개인 인스턴스를 사용하면보기 수준에서 실행 취소 기능의 유연성을 얻을 수 있습니다. 위의 예에서 사용자는 주문 세부 정보를 변경하고 변경 사항을 저장하지 않을 수있는 유연성을 제공 할 수 있습니다. 여기서 뷰/유스 케이스 간의 동기화는 데이터 지속성 레벨에서 발생합니다.
당신의 주장은 무엇입니까?
흥미 롭습니다.하지만 왜 equals/gethashcode를 구현해야합니까? 즉, ORM 빌더가 엔티티의 단일 인스턴스를 반환하지 않고 .NET에서 평등을 처리하게하는 이유는 무엇입니까?내가 목표로하는 것은 시나리오에 기반한 베스트 프랙티스입니다. 단순한 방식을 받아들이는 것이 아니라 사적인 인스턴스를 사용하는 것이 더 낫습니다. – tofi9
대부분의 경우 ORM *은 * 할 수 없기 때문에 * . ** 당신이 ** 객체의 인스턴스를 생성한다고 가정 해 봅시다. 그런 다음 데이터베이스를 유지합니다. 그런 다음 ORM을 사용하여 동일한 객체를 DB에서 꺼냅니다. ORM은 당신이 그 객체를 더 일찍 인스턴스화했다는 것을 어떻게 알 수 있습니까? 그것이 아는 전부는 캐시 된 것입니다. 그리고 많은 경우 프록시가 객체에서 사용되어 변경된 속성을 추적하는 데 도움을줍니다. 이제는 객체간에 "비즈니스 객체"의 동등성을 비교할 수있는 방법이 있기 때문에 구현해야합니다. 그들이 똑같은 경우 정말로 신경 씁니까? 그렇게한다면, 자신의 캐시를 유지하십시오. – snicker