문제

나는 Silverlight/Flex를 사용하기 시작했고 즉시 비동기 서비스 호출에 부딪쳤다. 한 서버 페치 메커니즘 또는 다른 서버 메커니즘을 사용하여 OO-Way에서 데이터 액세스 문제를 해결하는 데 익숙합니다.

다음과 같은 사소한 코드 예제가 있습니다.

public double ComputeOrderTotal(Order order) 
{ 
   double total = 0;
   // OrderLines are lazy loaded
   foreach (Orderline line in order.Orderlines) 
   { 
       // Article,customer are lazy loaded 
       total = total + line.Article.Price - order.Customer.discount;
   }
   return total;
}

내가 올바르게 이해하면 Flex/Silverlight에서는이 코드가 불가능합니다. 게으른 하중은 콜백으로 작업하게합니다. IMO 위의 간단한 기프자는 큰 혼란이 될 것입니다.

누구든지 위의 구현 방법을 줄 수 있습니까?

편집하다:

  • 문제는 Flex/Silverlight의 경우 동일하며 의사 코드는 잘 작동합니다.
  • 실제로 ORM 관련은 아니지만 대부분의 Orms는 게으른로드를 사용하므로 해당 태그를 제거하겠습니다.
  • 문제는 모델의 게으른 로딩입니다
  • 위의 예는 모든 데이터가 메모리에 있었지만 일부는 서버에서 가져와야한다고 가정합니다.
  • 때때로 데이터가 이미로드되었고 비동기 페치가 필요하지 않기 때문에 Closueres는 도움이되지 않습니다.
도움이 되었습니까?

해결책 7

C# 5 Async / Await Construct는 거의 정확히 내가 원하는 것을 ..

Anders Hejlsberg의 프레젠테이션을보십시오

다른 팁

예, O/R 매핑은 일반적으로 응용 프로그램의 서버 측에서 수행된다는 데 동의해야합니다. Silverlight에서 비동기 실행 방식은 서비스 작업을 수행 할 때 사용하기에 원하는 패턴입니다. 왜 서비스인가? 앞서 말했듯이 현재 클라이언트 측 (Silverlight)에서 사용할 수있는 O/R 매핑 도구가 없기 때문입니다. 가장 좋은 방법은 O/R 매핑 데이터를 Silverlight 애플리케이션으로 소비 할 수있는 서비스에 노출되는 것입니다. 현재 가장 좋은 방법은 ADO.NET DataServices를 사용하여 데이터를 전송하고 클라이언트 측에서 LINQ를 사용하여 데이터를 관리하는 것입니다. ADS (이전 Astoria Project)에서 정말 흥미로운 점은 엔티티 프레임 워크와 함께 사용되도록 설계되었지만 좋은 사람들은 iquerible에 대한 지원을 구현 했으므로 기본적으로 LINQ를 지원하는 모든 데이터 제공 업체를 연결할 수 있습니다. LINQ에서 SQL, Telerik을 고려할 수있는 사람이 거의 없다. OpenAccess, llblgen 등. 업데이트를 서버로 다시 푸시하려면 IPDATEBLE을 지원하기 위해 데이터 소스가 필요합니다.

내가 여기서 준비한 일련의 블로그 포스트에서 이것이 어떻게 할 수 있는지 정확히 볼 수 있습니다. Ado.net Data Services 및 Telerik Open Access 시작하기

Silverlight와 대화 할 수는 없지만 Flex는 웹 브라우저 클라이언트 기술이며 플래시 런타임에 데이터베이스 드라이버가 포함되어 있지 않습니다. 대신 웹 서버와 HTTP 프로토콜 상호 작용을 수행 할 수 있습니다. Java JDBC와 같은 데이터베이스 연결과 관련하여 ORM을 수행하는 중간 계층 웹 서버에 있습니다. Hibernate ORM과 IBATIS는 Java Middle-Tier Space에서 두 가지 인기있는 선택입니다.

또한이 때문에 :

분산 컴퓨팅의 오류

Flex 클라이언트에서 중간 계층 서비스에 이르기까지 동기 상호 작용을하지 않습니다. 동기 네트워크 운영은 요즘 동기화되었으며 위의 링크에서 열거 된 이유로 인해 앱은 매우 나쁜 사용자 경험을 나타낼 수 있습니다.

대신 Async 호출을하여 데이터를 검색하고 클라이언트 앱의 모델 객체에 데이터를로드하고 모델에서 작업을 구현합니다. Flex 및 Blazeds를 사용하면 클라이언트에 중간 계층 푸시 데이터를 제공하고 클라이언트의 모델 객체를 비동기 적으로 업데이트 할 수 있습니다. (데이터 바인딩은 이벤트 기반 방식으로 업데이트되는 데이터에 응답하는 한 가지 방법입니다.)

이 모든 것이 아마도 귀하의 게시물에서 문의의 특성과는 거리가 멀다는 것입니다. 그러나 귀하의 게시물은 기본적으로 기본적으로 구운 비동기 및 이벤트 중심 프로그래밍이있는 클라이언트 측 기술을 이해하는 방법에 대한 완전히 잘못된 기반을 유지하고 있음을 나타냅니다. 건축물. 이러한 RIA 클라이언트 기술은 의도적으로 완전히 설계되었습니다. 따라서, 당신은 그들을 사용하여 좋고 생산적인 경험을 원한다면 그들의 사고 방식을 배워야합니다.

이 기사에서는 이것에 대해 더 자세히 설명하고 Flex 관점을 가지고 있습니다.

Flex Async I/O VS Java 및 C# 명시 적 스레딩

Flex에 대한 직접적인 경험 에서이 토론이 너무 복잡해지고 있다고 생각합니다.

귀하의 개념적 OO보기는 Sync와 Asynch간에 다르지 않습니다. 유일한 차이점은 이벤트 핸들러를 사용하여 메소드 호출에서 반환 된 것보다는 DAL의 호스트 대화를 처리한다는 것입니다. 그리고 그것은 종종 호스트 측면에서 발생하며 Flex 또는 Silverlight와 아무 관련이 없습니다. (워크 스테이션 앱에 Air를 사용하는 경우 클라이언트 코드에있을 수 있지만 동일하게 적용됩니다. 연장 된 Ajax를 사용하는 경우에도 Silverlight는 공기에 해당하지 않습니다.)

나는 비동기를 수용하는 데 필요한 다른 변경없이 필요한 모든 것을 설계 할 수있었습니다.

Flex에는 단일 스레드 모델이 있습니다. 웹 서버와 동기식 호출을하는 경우 응용 프로그램의 전체 GUI를 차단합니다. 사용자는 통화가 완료 될 때까지 (또는 네트워크 오류 조건에서) 응용 프로그램이 동결됩니다.

물론 실제 RIA 프로그램은 그런 식으로 작성되지 않았습니다. 그들의 GUI는 비동기 호출을 사용하여 사용자에게 액세스 할 수 있고 반응이 유지됩니다. 또한 취소 버튼을 제공하는 실제 진행 지표 등이 가능합니다.

오래되고 나쁜 사용자 경험 웹 1.0 응용 프로그램은 웹 계층과의 상호 작용에서 동기 동작을 나타 냈습니다.

링크 된 기사가 지적했듯이 ActionScript3 클로저와 결합 된 비동기 단일 스레드 모델은 대체-멀티 스레드 앱 작성보다 훨씬 간단한 프로그래밍 모델이기 때문에 좋은 것입니다. 멀티 스레딩은 GUI에서 유사하게 반응이 좋고 Fluid-At-Times 사용자 경험을 달성하기 위해 Client-Server Java Swing 또는 C# .NET WinForm 애플리케이션을 작성하는 접근 방식이었습니다.

다음은 비동기식, 메시징/이벤트 중심 분산 앱 아키텍처 의이 전체 주제를 탐구하는 또 다른 기사입니다.

효과적인 엔터프라이즈 분산 소프트웨어 시스템 구축 데이터 중심의 커뮤니케이션 대 행동 중심 커뮤니케이션

Silverlight는 클라이언트 기술이며 객체 - 관계형 매핑은 서버에서 완전히 발생합니다. 따라서 Silverlight의 ORM을 잊어야합니다.

예제에 따라해야 할 일은 Silverlight 클라이언트에게 완전한 "주문"객체를 제공 할 수있는 웹 서비스 (SOAP, REST ...)를 만드는 것입니다. 객체가 있으면 정상적인 동기식으로 서버와 통신없이 작업 할 수 있습니다.

Silverlight에 대해 말하면 확실히 확인해야합니다 RIA 서비스.

간단히 말해서, 데이터 컨텍스트를 서버에서 클라이언트로 비동기로 쿼리 할 수있는 곳에서 클라이언트로 가져옵니다 (수작업으로 WCF 서비스를 작성할 필요가 없으며 RIA가 모두 수행됩니다).

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