2

RIA 서비스와 Silverlight 4에서 NHibernate를 사용하고 있습니다. 나는 Martin Fowler의 분산 법칙에 따라 도메인 계층 객체를 배포하는 대신 RIA 서비스를 통해 데이터를 전송하기위한 DTO를 만듭니다. 객체 디자인 : "객체를 배포하지 마십시오!"). DTO 개체는 도메인 계층의 5 개의 해당 계층에서 두 개의 계층으로 병합됩니다.RIA 서비스와 함께 NHibernate와 DTOs를 사용하는 방법

여기 내 문제가 있습니다. Silverlight 4에서 변경 한 후 RIA Services는 수정 된 DTO 개체를 알고 있지만 서버 측 업데이트 코드에서 변경 사항을 "실제"도메인 계층 개체로 다시 전송해야 NHibernate에서 이러한 변경 내용을 다시 데이터 베이스. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

DTO는 가볍기 때문에 클라이언트 측에서 필요한 정보 만 포함하므로 분명히 이 아니며은 해당 도메인 객체를 DTO에 포함하려고합니다. 여기

내가 생각 한 그 가능성의 몇 가지 :

1) DTO 객체 내에서 도메인 객체에 대한 참조를 누릅니다. 만 있으면 참조 된 전체 객체가 이 아닌이 아닌 일련의 참조가 직렬화되어 전송됩니다. 이는 합리적인 방법 일 수 있습니다. 물론 존재하지 않는 메모리 위치를 가리 키기 때문에 참조가 클라이언트 측에서 유효하지는 않지만 여행이 끝나면 서버 측에서 사용될 수 있습니다. (?)

2) 위와 같지만 도메인 집계 루트에 대한 참조 만 DTO 개체에 저장합니다. 그런 다음 객체 관계 탐색을 사용하여 다른 관련 도메인 객체를 가져옵니다.

3) 도메인 객체의 ID를 DTO에 저장하고 NHibernate의 "Get"by ID 또는 "Load"by ID 기능을 사용하여 올바른 도메인 객체를 검색하여 업데이트를 적용 할 수 있습니다.

4) 위와 동일하지만 집계 루트에 대해 "가져 오기"또는 "로드"만 사용하고 관련된 모든 개체에 대해 순회를 사용하십시오.

아마도 위의 어느 것도 적합하지 않고 더 나은 방법 ...

내가 ORM 위에 액세스 레이어를 만들 때마다

답변

3

, 나는 일반적으로 계속 진행하여 DTO에서 엔티티에 대한 고유 키가 무엇이든 넣어이있다 , 그래서 추적되며 물론 추가 (add)의 경우 default (T)를 지원합니다.

개체가 서버 측으로 되돌아 오면 쉽게로드 할 수 있으며 변경된 값을 DTO에서 마샬링 한 다음 세션에 저장하거나 명시 적으로 저장하도록 할 수 있습니다.

이것은 3/4입니다.

+0

당신이 동시성 문제를 방지 할뿐만 아니라 버전 필드를 처리 할 수 ​​있다는 것을 잊지 마십시오. – Sam

+0

Jeremy and Sam, 팁 주셔서 감사합니다! – MylesRip

0

기본 수준에서 질문에 대답하려면 - 프레젠테이션 모델을 조사하고 싶을 수 있습니다. RIA Services 팀의 Deepesh는 그것에 대해 좋은 introductory blog post을 가지고 있습니다.

또한 참조 대신 ID를 사용할 수 있습니다 (예 : app-domain-scoped 개체 참조 대신 내장형 직렬화 가능 값). [연관]을 사용합니다.

다음 수준에서 대답하려면 프레젠테이션 모델 사용에는 여전히 작업 및 추가 유형이 필요합니다. 보려는 모델의 모양이 서버의 모양과 실질적으로 다른 경우 (리치 도메인 모델이든 DTO 기반 모델이든) 가장 적합합니다.유형 수의 증가와 그 사이의 매핑 필요성은 유연성을 위해 지불하는 비용입니다. 저렴한 옵션 - 예 : 비공개 멤버, 직렬화 지시문 [Exclude] 등을 사용하여 코드 생성 및 직렬화 모델을 형성 할 수 있습니다. 그들은 고려할 가치가 있습니다. 결국 신뢰 경계의 양측에있는 유형은 기본적으로 매우 다릅니다 (예 : 서버 유형과 클라이언트의 코드 유형).

HTH

네쉬

+0

안녕 Dinesh, 내 DTOs 내가 클라이언트에서 보길 원하는 모양에 맞게 설계되었습니다. 이는 리치 도메인 계층의 모양과 완전히 다릅니다. 기본적으로 프레젠테이션 모델입니다. (내가 본 몇 가지 예는 서버 대신 클라이언트에서 생성되는 프리젠 테이션 모델을 보여 주지만, 이는 와이어를 통해 추가 정보를 전송한다는 것을 의미합니다.) Deepesh의 블로그는 업데이트 루틴에서 LINQ를 사용한다는 것을 제외하면 내 상황과 일치합니다 "DTO"에서 DAL 개체로 업데이트를 셔틀 링합니다. 내 질문은 NHibernate (NH의 캐싱 및 변경 추적 활용)을 사용하여이를 수행하는 방법입니다. – MylesRip