0

私は Silverlight/flex を使い始めて、すぐに非同期サービス呼び出しにぶつかりました。私は、データ アクセスの問題をサーバー フェッチ メカニズムまたは別のメカニズムを使用してオブジェクト指向の方法で解決することに慣れています。

次の簡単なコード例があります。

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 は遅延読み込みを使用するため、そのタグを削除します
  • 問題はモデルの遅延読み込みです
  • 上記の例は、すべてのデータがメモリ内にある場合に非常に実行可能ですが、一部はサーバーから取得する必要があると想定しています
  • データがすでにロードされていて、非同期フェッチが不要な場合があるため、クロージャーは役に立たない
4

7 に答える 7

1

Silverlightと話すことはできませんが、FlexはWebブラウザークライアントテクノロジであり、Flashランタイムにデータベースドライバーが組み込まれていません。代わりに、Webサーバーに対してHTTPプロトコルの相互作用を行うことができます。これは、JavaJDBCなどのデータベース接続に関してORMを実行する中間層Webサーバーにあります。Hibernate ORMとiBATISは、Java中間層スペースで人気のある2つの選択肢です。

また、このため:

分散コンピューティングの落とし穴

Flexクライアントからその中間層サービスへの同期相互作用は行いません。同期ネットワーク操作は最近冗長になり、不十分に設計されたアプリケーションの特徴的な署名です-上記のリンクに列挙されている理由により、アプリは非常に悪いユーザーエクスペリエンスを示す可能性があります(多くの場合、そうなるでしょう)。

代わりに、非同期呼び出しを行ってデータを取得し、データをクライアントアプリのモデルオブジェクトにロードして、モデルへの操作の実装に進みます。FlexとBlazeDSを使用すると、中間層のデータをクライアントにプッシュして、クライアントのモデルオブジェクトを非同期で更新することもできます。(データバインディングは、イベント駆動型の方法で更新されるデータに応答する1つの方法です。)

これはすべて、投稿の問い合わせの性質からはかけ離れているように思われますが、投稿は、非同期およびイベント駆動型プログラミングが基本に組み込まれているクライアント側のテクノロジーを理解する方法について、まったく間違った立場にあることを示しています。建築。これらのRIAクライアントテクノロジは、完全に意図的にこのように設計されています。したがって、それらを使用して優れた生産的な経験をしたい場合は、それらの考え方を学ぶ必要があります。

この記事では、これについて詳しく説明し、Flexの観点から説明します。

Flex Async I / OとJavaおよびC#の明示的なスレッド

于 2008-12-23T02:47:52.773 に答える
1

Flex に関する私の直接の経験では、この議論は複雑になりすぎていると思います。

概念的な OO ビューは、同期と非同期の間で違いはありません。唯一の違いは、メソッド呼び出しから返されるものではなく、イベント ハンドラーを使用して DAL でホストの会話を処理することです。そして、これは完全にホスト側で発生することが多く、Flex や Silverlight とは関係ありません。(ワークステーション アプリに AIR を使用している場合、それはクライアント コードにある可能性がありますが、同じことが当てはまります。長時間の AJAX を使用している場合も同様です。もちろん、Silverlight には AIR に相当するものはありません。)

非同期に対応するために必要な他の変更を行うことなく、必要なものすべてを設計することができました。

于 2008-12-23T02:55:19.233 に答える
1

Flex にはシングルスレッド モデルがあります。Web サーバーに対して同期呼び出しを行うと、アプリケーションの GUI 全体がブロックされます。ユーザーは、呼び出しが完了するまで (またはネットワーク エラー状態などでタイムアウトになるまで)、アプリケーションがフリーズします。

もちろん、実際の RIA プログラムはそのようには書かれていません。GUI は、非同期呼び出しを使用することで、引き続きアクセス可能で、ユーザーに応答します。また、インタラクションの性質上、キャンセル ボタンなどを提供する実際の進行状況インジケーターを使用することもできます。

古くてユーザー エクスペリエンスの悪い Web 1.0 アプリケーションは、Web 層とのやり取りで同期動作を示しました。

私のリンクされた記事が指摘しているように、ActionScript3 クロージャーと組み合わせた非同期シングルスレッド モデルは良いことです。なぜなら、マルチスレッド アプリを作成するという代替手段よりもはるかに単純なプログラミング モデルだからです。マルチスレッドは、クライアント/サーバー Java Swing または C# .NET WinForm アプリケーションを記述して、GUI で同じように応答性が高く、常に滑らかなユーザー エクスペリエンスを実現するためのアプローチでした。

非同期のメッセージング/イベント駆動型分散アプリ アーキテクチャの主題全体を掘り下げた別の記事を次に示します。

効果的なエンタープライズ分散ソフトウェア システムの構築 データ駆動型コミュニケーション vs 行動駆動型コミュニケーション

于 2008-12-23T05:42:48.443 に答える
0

Silverlightについて言えば、RIAサービスを必ず確認する必要があります。

単純に、DataContextをサーバーからクライアントに移動し、そこから非同期でクエリを実行できます(WCFサービスを手動で作成する必要はなく、すべてRIAによって実行されます)。

于 2009-12-21T16:23:26.487 に答える
0

Silverlight はクライアント テクノロジであり、オブジェクト - リレーショナル マッピングは完全にサーバーで行われます。そのため、Silverlight の ORM を忘れる必要があります。

あなたの例に従って、Silverlightクライアントに完全な「注文」オブジェクトを提供できるWebサービス(SOAP、REST ...)を作成する必要があります。オブジェクトを取得したら、通常の同期方法でサーバーと通信せずに操作できます。

于 2008-12-12T11:07:49.620 に答える
0

C# 5 async / await コンストラクトは、私が望むものとほとんど同じです..

anders hejlsberg によるプレゼンテーションを見る

于 2010-11-12T12:04:49.847 に答える