2009-04-17 4 views
1

저는 데이터 매퍼 (Data Mapper)가있는 도메인 모델에 파울러 패턴을 사용하고 CRUD의 생성 부분을 구현하는 방법에 대해 혼란을 겪었습니다. 기본 데이터 소스가 맞춤 시스템이므로 기존 ORM 기술을 사용할 수 없습니다. 나를 괴롭히는 영역은 새 객체를 만들어야 할 때 기본 ORM을 호출하는 방법입니다. 내 도메인 계층은 내 파인더를 제외하고 내 ORM에 대한 가시성이 없습니다. 내가 볼 수파울러 데이터 매퍼 객체 생성

는 내가 바른 길에있어 잘 모르겠어요하지만 다음의 유일한 옵션입니다

  1. 가이 기능을 파울러 측정기 완료 같은 방법을 만들 처리합니다. ORM 클래스의 생성 메소드에 대한 도메인 모델 계층에 인터페이스를 작성하십시오. 그런 다음 도메인 모델에서 DI 컨테이너를 호출하고 인터페이스를 기반으로 ORM 클래스의 인스턴스를 인스턴스화합니다.

  2. ORM에있는 객체 A의 수화 과정에서 객체 B에 대한 ORM의 생성 메소드를 가리키는 대리인을 첨부합니다. 도메인 객체 A가 필요하다고 요구하면 개체 A의 대리인을 호출 할 수 있습니다. B의 매퍼.

  3. ???

나는 그다지 복잡하지 않을 수 있습니다. 도움을 주시면 감사하겠습니다.

감사합니다.

답변

2

어떻게 ORM이이 문제를 해결할 수 있을까요? 객체의 동적 생성을 지원하는 언어에서 데이터가 도메인 객체와 관련되는 방식의 "매핑"은 별도의 구성으로 제공됩니다. 클래스는 리플렉션 또는 바이트 코드 라이브러리를 통해 만들어집니다. 데이터 매퍼를 얼마나 일반적으로 만들고 싶은지에 따라 달라집니다. 원래 패턴에서 수집 할 수있는 데이터에서 도메인 객체 당 데이터 매퍼가 존재할 수 있습니다.

아마도 일반적인 해결책을 시도하고 있습니다. 그렇지 않으면 리플렉션을 사용하여 오브젝트를 빌드하는 방법에 대한 정보로 일반 맵퍼를 구성하는 것일 수 있습니다.

ORM 계층은 CanonicalClass 이름을 나타내는 문자열과 해당 클래스에서 예상되는 메서드 목록을 처리 할 수 ​​있습니다.

개체를 전달하면이 정보를 사용하여 개체를 검사 할 수 있습니다. 객체 생성은 데이터베이스의 데이터를 사용하여 리플렉션을 사용하여 수행 할 수 있습니다. 일부 ORM 솔루션은 객체 트리를 깊은 방법으로 생성하지 않고 대신 Lazy 페칭을위한 프록시를 생성합니다.

1

문제가 유형 A에서 유형 B로 매핑되는 경우 AutoMapper을 고려할 수 있습니다.

0

재 :

당신이 AGGREGATE ROOT 및 저장소 패턴의 아이디어로 봤어 "나는 새로운 객체를 생성 할 때 기본 ORM을 호출하는 방법"- 그들은 도움이 될 수 있습니다.

대략적인 요약 : 전체 레전은 시스템 내에서 전역 적으로 고유 한 ID를 가진 '실체'입니다. 대부분의 경우, 이것들은 응용 프로그램이 'id에 의해'잡아 내야 할 유일한 객체입니다. 그것들은 응용 프로그램 시작/부트 스트랩에서 일반적으로 으로 초기화되는 데이터베이스에 대해으로 초기화되는 저장소를 통해 발견됩니다.

전체 루트에 대한 팩토리는 일반적으로 응용 프로그램 시작/부트 스트랩에서 데이터 레이어에 대해 으로 알 수 있습니다 ().

REPOSITORY는 원하는 방식으로 개체의 데이터를 수집하는 프로세스를 중재 할 수 있습니다. REPOSITORY는 원시 데이터를 얻기 위해 datalayer/mapper에게 위임하고 건물을 수행하기 위해 FACTORY (클래스/메소드)로 오브젝트 재구성의 실제 작업을 위임하는 경향이 있습니다. REPOSITORY는 새로 재구성 된 AGGREGATE ROOT 오브젝트 또는 (콜렉션 - of)를 저장소의 find 메소드를 호출 한 클라이언트 (예 : 응용 프로그램)에 보냅니다. REPOSITORY는 AGGREGATE ROOT를 검색하고 저장하는 인터페이스이며 메모리에 저장되는 동작을 제공합니다.

그러나 응용 프로그램에서는 FACTORY를 직접 사용하여 새로운 AGGREGATE ROOT 개체를 만들 수 있습니다.

AGGREGATE ROOT의 공장은 ORM/Mapper 레이어에 대한 지식이 풍부하고 새로운 엔티티를 만들 때 고유 ID를 얻기 위해 일종의 '숫자 시퀀스 객체'서비스를 호출 할 수 있습니다.

AGGREGATE 뿌리는 일반적으로 다른 도메인 개체 중 하나이기 때문에 '세계적으로 알려진 ID로 찾기'할 필요가 도메인 개체의 유일한 종류의 :

  • 일회용 값 객체 - 돈 값과 같은, 또는
  • '전체 루트 종속적 인'엔티티. 나는.
    • 총 ROOT 정말 그것을 발견하기 만해야한다는 것을 의미 집계 루트의 컨텍스트 내에서만 고유 ID가 개체/사용 - 내부
    • 그들이 찾을 수 있습니다
    • 그들의 ID를 컨텍스트/범위를 정의 AGGREGATE 루트에 의해 생성 될 수 AGGREGATE ROOT의 ORM 매퍼를 사용

더 읽을 : 0

도메인 기반 디자인, Eric Evans를 참조하십시오.

집계 루트 : http://books.google.co.uk/books?id=7dlaMs0SECsC&lpg=PP1&dq=domain%20driven%20design&pg=PA147#v=onepage&q=&f=false

Repositroies : http://books.google.co.uk/books?id=7dlaMs0SECsC&lpg=PP1&dq=domain%20driven%20design&pg=PA147#v=onepage&q=&f=false

0

리처드는 AutoMapper을 체크 아웃 제안하면, .NET에 구현하는 경우. Java로 구현하는 경우 ModelMapper을 확인하십시오.