Persistence-Ignorant 객체는 지연 로딩을 구현할 수 있습니까?


12

Persistence Ignorance 는 단일 책임 원칙을 적용한 것으로, 실제로 Domain Objects ( DO )에는 지속성과 관련된 코드가 없어야하며 대신 도메인 논리 만 포함해야합니다.

a) 이것은 하위 계층 (즉, 영속 계층)과 접촉하는 코드 가 비즈니스 로직 계층의 다른 클래스 ( OC ) 에서 도메인 모델 외부에 존재한다는 것을 의미한다고 생각 합니까?

B)에서 내 가정하면 A)가 올바른지, 다음 DO 말, Customer결코 같은 방법을 포함하지 GetCustomersGetCustomerByID?

c) a)b)의 가정이 정확하고 Customer도메인 객체가 그 속성 중 일부에 지연 로딩을 사용 한다고 가정하면 어떤 시점에서 Customer내부 논리가 OC 와 접촉해야하며 , 이로 인해 지연된 데이터가 검색됩니다. 그러나 지연된 데이터를 받기 Customer위해 OC 에 연락해야하는 경우 도메인 개체에 지속성과 관련된 논리가 포함되어 있지 않다고 주장 할 수 없습니다!

감사합니다

jkohlhepp에 응답

1) 나는 가정 OrderProviderCustomerProvider클래스는 비즈니스 로직 계층에 포함된다?

2) 나는 b)의 나의 가정 이 옳다는 답을 당신의 답에서 모은다 .

삼)

... 일부 개인 주문 필드가 채워 졌는지 또는 널인지 확인합니다. 그것이 null이라면 ...

그러나 내가 알 수있는 한, 도메인 코드가 개인 order필드가 채워 졌는지 여부를 확인 하고, 그렇지 않으면 OrderProvider에 연락하면 이미 PI 원칙을 위반하고 있습니까 ?!

답변:


4

나는 당신이 영속 무지에 대한 당신의 가정 A와 B에서 정확하다고 생각합니다.

데이터베이스 오브젝트의 지연로드를 가장 잘 수행하는 방법은 특정 문제점 및 구현에 크게 좌우됩니다. 그러나 지속성과 도메인 논리 클래스 사이의 우려를 분리하면서 게으른 로딩을 수행하는 방법에 대한 일반적인 대답을 시도 할 것입니다.

다음 클래스를 사용하여 지속성 무지를 구현하는 경향이 있습니다.

  • 도메인 클래스-예 : 고객
  • 공급자 / 저장소 클래스-예 : CustomerProvider
  • 일반 데이터베이스 쿼리 클래스-예 : DatabaseQuery

DatabaseQuery 클래스는 데이터베이스 드라이버를 사용하여 데이터베이스를 쿼리하고 결과 데이터를 DataTable과 같은 일반 결과 집합으로 어셈블합니다. CustomerProvider는 DatabaseQuery 클래스를 사용하여 데이터베이스에 대해 SQL을 실행하고 해당 SQL의 결과를 사용하여 Customer 인스턴스를 어셈블 할 책임이 있습니다. 고객은 고객과 관련된 데이터와 논리를 포함하는 "순수한"도메인 개체입니다.

공급자 클래스가 비즈니스 계층 또는 데이터 계층 중 어디에 있어야하는지에 대해서는 강한 의견이 없습니다. 둘 다에 대한 사례를 볼 수 있습니다. 중요한 부분은 여러분이 책임을 수업에서 분리한다는 것입니다.

이제 지연 로딩에 대해 설명하겠습니다. 고객이 주문 모음을 갖기를 원했지만 소비자가 주문을 시도하지 않는 한 주문을 데이터베이스에서 꺼내고 싶지 않습니다. 고객에 주문이라는 속성을 작성합니다. 해당 속성의 getter에서 개인 주문 필드가 채워 졌는지 또는 null인지 확인합니다. 널인 경우 OrderProvider를 사용하여 데이터베이스에서 주문을로드하십시오. 그렇지 않으면 이미로드 된 모음을 반환하십시오.

제 생각에는 고객이 OrderProvider에 연락해야 한다고해서 PI를 위반 하지는 않습니다 . 고객은 여전히 주문을받는 방법 을 모릅니다 . OrderProvider에서 가져 오는 것만 알고 있습니다. 고객을 OrderProvider에서 분리해야하는 다른 이유가있을 수 있지만 여기서 PI는 문제가되지 않습니다.

이는 수동으로 지속성 무지를 수행한다고 가정합니다. Entity Framework 또는 Hibernate와 같은 ORM 프레임 워크를 사용하는 경우 해당 프레임 워크에는 일반적으로 자동으로 지연로드를 지원하는 기능이 있습니다.


안녕, 시간을 찾을 경우-귀하의 답변에 대한 답변으로 내 게시물을 편집했습니다
user1483278

1
@ user1483278 나는 그 질문들을 다룰 수 있도록 답을 편집했다.
RationalGeek

PI는 무엇을 의미합니까?
Kugel

지속 무지
RationalGeek

2

도메인 객체를 채우는 와이어 업 클래스 (예 : "리포지토리")가 있습니다. 지연 로딩 또는 원하는 종류의 캐시 일관성 구성표를 구현할 수 있으며 도메인 객체는 더 현명하지 않습니다. 도메인 개체를 채우는 책임과 도메인 개체를 분리해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.