문제

나는 무국적 웹 사이트 만들기에 관한 몇 권의 책을 읽었고, 상태가 많은 클라이언트 응용 프로그램에 대해 읽었지만, 둘 다 결합해야 할 때 많은 복잡성이 나옵니다. .NET Services를 통해 데이터베이스에 데이터를 지속 해야하는 Flex 응용 프로그램이 있습니다. 명심해야 할 것은 다음과 같습니다 .- 동시성 (낙관적/비관적) - 성능 : 플렉스는 많은 데이터에로드해야하므로 게으른로드가 종종 필요합니다. - DTO를 사용하여 서버와 클라이언트 간의 데이터를 트랜퍼로 사용합니까?

우리 제품의 역사를 알려 드리겠습니다. 우리는 처음부터 AO/R Mapper로 Subsonic을 사용했습니다. 하위 소닉 객체는 우리가 작성한 DTO로 변환 되며이 DTO는 클라이언트로 전송됩니다. Clientside DTO는 도메인 모델로 변환됩니다. ClientSide 도메인 모델 객체를 저장 해야하는 경우 DTO로 다시 변환하여 서버로 전송됩니다. 서버 측 DTO는 하위 소닉 객체로 변환되어 데이터베이스에 저장됩니다.

이제 얼마 전에 .NET 서버 측의 도메인 모델이 필요했습니다. 이제 서버 측, 서브닉 모델, DTO 모델 및 도메인 모델에 세 가지 모델이 있습니다. DTO 모델은 더 간단하고 데이터베이스와 더 유사하며 도메인 모델에는 훨씬 더 많은 논리가 있습니다. 복잡해집니다 ... 이제 AS3 도메인 모델 코드를 C# 도메인 모델 코드와 동기화해야합니다. 다시 할 수 있다면 (리팩터에 시간을 올릴 시간) 더 이상 DTO를 사용하지 않지만 클라이언트와 서버간에 도메인 모델을 전송할 것이라고 생각합니다. 질문은 이것이 현실적인 경우입니다. DTO는 전송하기 쉬운 간단한 개체입니다. 도메인 모델 객체는 매우 복잡 할 수 있습니다.

이러한 종류의 응용 프로그램을위한 아키텍처를 만드는 방법에 대한 책이 있습니까? 많은 경험이있는 사람에 의해 책을 writte? 이것에 대한 경험이 있습니까?

도움이 되었습니까?

해결책

현실은 클라이언트와 서버 간의 객체를 공유하는 것이 매우 복잡하다는 것입니다. 다음은 다음과 같이해야 할 일입니다.

쉬운/비정치 방법 :

상속 모두 당신의 물체의 MarshalByrefObject. 서버에서 객체 A를 생성하고 클라이언트로 보내면 객체에 대한 클라이언트 수정이 서버로 자동 전달됩니다.

이것은 완벽한 솔루션처럼 들리지만 두 가지 주요 문제가 있습니다.

  1. 클라이언트와 서버는 .NET (Bye-Bye Web Services)와 밀접하게 결합되어 있습니다.
  2. 공연 악몽 일 수 있습니다. 모든 방법/속성 액세스는 서버로 전달됩니다. 이 경로를 선택하면 객체는 실제로 채찍질이 아닌 청키 한 통화 용으로 설계되어야합니다.

확장 가능/어려운 방법 :

사용하는 대신 MarshalByRefObject, 당신은 사용할 것입니다 DataContract/Serializable 사물. 하지만:

  • 당신이 만든 경우 대상 a 서버에서 클라이언트에게 보내면 클라이언트는 복사 대상의 (그것을 부르자 대상 b)
  • 보낼 때 대상 b 서버로 돌아가서 서버는복사 객체 B (그것을 부르자 객체 c)

그러나 당신은 정말로 서버가 처리하기를 원합니다 대상 a 그리고 객체 c 동일합니다. 불행히도 CLR은 이것을 할 수 없으므로 객체 합병 클라이언트와 서버 모두에 앉습니다.

그만큼 객체 합병 모델 내의 모든 객체의 사전을 포함하고 두 인스턴스를 동일하게 식별하는 방법을 알고 수신 끝에서 값을 병합합니다. 예를 들어, 클라이언트가 이미 메모리에 객체 C를 가지고 있고 서버에서 업데이트 된 사본을 수신하는 경우 값에 대해 복사합니다.

불행히도, 이것은 객체 참조가 올바르게 보존되도록해야하기 때문에 문제가 발생합니다. 객체에 다른 객체에 대한 기존 참조가있을 수 있으므로 객체의 모든 속성을 맹목적으로 업데이트 할 수는 없습니다. 무엇보다도 목록이나 사전에 포함 된 추가/제거 된 개체를 추적해야합니다.

나는 내 자신의 프레임 워크에 n-tier 지원을 추가하기 때문에 지금 같은 운동을 겪고 있습니다 ( "확장 가능/하드"경로를 복용하고 있습니다). 다행히도, 나는 식별, 병합 등을 지원하기 위해 많은 지원 인프라가 있습니다. 처음부터 시작하는 경우 중요한 작업이 될 것입니다.

PS는 믹스에 게으른로드 프록시를 추가합니다 (nhibernate를 사용하고 있습니다). 흥미로운...

다른 팁

Fowler, 특히 그의 디자인 패턴 재료 (특히 어셈블러 패턴과 이미하고있는 일이 필요한 이유)의 모든 것을 읽으십시오.

Fowler의 엔터프라이즈 애플리케이션 아키텍처 패턴

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top