2009-06-01 11 views
8

ASP.Net MVCアプリケーションのモデルとしてWebサービスを使用する際のアドバイスやヒントはありますか?私はこれを行うことについて誰も書いていない。私は、MVCアプリケーションを構築したいと思いますが、特定のデータベースを使用したり、データベースを単一のMVCアプリケーションに限定することはできません。私は、Webサービス(RESTful、おそらくADO.Net Data Services)が道のりだと感じています。Webサービスを搭載したASP.Net MVCはモデルですか?

答えて

3

編集2010-11-27;本当に必要だった私の思考を明確にしました。

Webサービスは、ほとんどの場合、異なるタイプのアプリケーション間ではなく、1つのアプリケーションでの抽象化のための機能を公開します。あなたはおそらくコントローラ/ビュープログラミングを妨げない方法でコマンドと読み取りをカプセル化する方法をもっと考えているでしょう。

デカップリング後に非同期ページでサービスバスからサービスを使用し、非同期ページで非同期パターンを実行します。 .Netネイティブ実装の場合はRhino.ServiceBus、nServiceBus、MassTransit、http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/の場合はRabbitMQが表示されます。

編集:メッセージをプッシュして私のサービスに送る方法でウサギを試してみると、ブックストアアプリにアップデートが追加されました。 RabbitMQはメッセージブローカー、つまりMOM(メッセージ指向のミドルウェア)であり、アプリケーションサーバーにメッセージを送信するために使用することができます。

サービスインタフェースを提供することもできます。 Eric Evanのドメイン駆動型設計を読み、詳細な説明を参照してください。

REST-fulサービスインターフェイスは、データ、特にアドレス可能なリソースを多く扱います。これにより、プログラミング・モデルが大幅に簡素化され、HTTPプロトコルによる出力の制御が大幅に向上します。 WCFの今後のプログラミングモデルは、元の論文で定義されている真の休憩を使用しています。各文書では、継続的なナビゲーションのためにURIをある程度提供する必要があります。 look at thisがあります。 は、RESTベースのAPI(この記事の私の最初のバージョンでは、私が「遅い」、何でもその手段であることのためRESTを嘆い)もほとんど何CouchDBRiak用途です。

ADO.Netは、コードツーインプリメンテーション、データアクセスの漏れのため、レイジーコレクションのN + 1の問題です(クエリコードなどのどこにでもDBコンテキストが必要です)。例えばLightSpeed(商業)またはNHibernateである。 Spring.Netでは、Webサービスファサードを含むサービスインタフェースをラップすることもできますが、(しばらくブラウズしなくても)設定に少し余裕があると思います。

編集1:ここでは、ADO.Netを使用すると、DataSet、DataAdapterでデフォルトの「ベストプラクティス」を意味し、DataReaderから多くの行を繰り返します。むしろ醜く難しいコードを作り出します。 N + 1は、エンティティフレームワークに関するものです。

(編集2:EntityFrameworkはどちらか私を感動しません!)

編集1:別名[別のアセンブリにドメイン層を作成します。コア]を選択し、そこにすべてのドメインおよびアプリケーションサービスを提供し、次にこのアセンブリを特定のMVCアプリケーションからインポートします。いくつかのDAO/Repositoryのデータ・アクセスを、コア・アセンブリ内のインタフェースを介してラップし、Dataアセンブリがそれを参照して実装します。 IoCを使用したインタフェースと実装のワイヤリング。上記のサービスバスを使って動的サービス発見のために何かをプログラムして、インターフェースを解決することさえできます。 WCFはこのようなインターフェイスを使用しているため、上記のサービスバスのほとんどはそうしています。 IoCコンテナにサブコンポーネントのリゾルバを提供して、これを自動的に実行することができます。

編集2: 上記の優れたコンボは、CQRS + EventSourcing + ReactiveExtensionsです。あなたの書き込みモデルはコマンドを受け取り、あなたのドメインモデルはそれらを受け入れるかどうかを決定します。それは、おそらくあなたの読み取りモデルが消費するRabbitMQを介して、イベントをreactive-extensionsパイプラインにプッシュします。

更新2010-01-02(編集1)

私の考えの冗談ははMindTouch夢と呼ばれるもので成文化されています。彼らはRESTで公開されている(ウェブ)サービスとしてウェブアプリケーションのほぼすべての部分を扱うスクリーンキャストを作りました。

彼らは独自の弾性スレッドプールを含むこれを処理するために、コルーチンを使用して非常に並列なフレームワークを作成しました。

この質問のすべてのnay-sayersに、UR顔:p!特に12分でListen to this screen-cast,

The actual framework is here.

あなたがプログラミングのこの種にしている場合は、how monads worktheir implementations in C#を見てみましょう。 CoRoutinesで読むこともできます。

新しい年!

を更新2010年11月27日(エディット2)

それはコルーチンは、Microsoftからタスク並列ライブラリーで製品化しまっ判明。タスクがIAsyncResultを実装するのと同じ機能を実装するようになりました。 Caliburnは、それらを使用するクールなフレームワークです。

Reactive Extensionsは、モナドの理解度を次のレベルの非同期に引き上げました。

ALT.Netの世界は、私がほとんど知りませんでした新しいタイプのアーキテクチャでも、この回答を初めて書いたときに話した方向に動いているようです。

+0

ORM(段落#4)と比較していますか? LINQ2SQLまたはEFを意味しましたか? – MotoWilliams

+0

ORMはADO.Netを使用します。私はそれらをそれぞれデータベースへのメインインターフェースとして使用して比較していました。その場合は意味があります。 – Henrik

+0

N + 1 on ado.net?私は真剣に....を意味します。 レイジーロードされたコレクションは、nhibernateで到達する特定のシナリオではN + 1のみを引き起こします。そのため、linq2sqlを含む、合理的なORMでフェッチ戦略を使ってクエリごとに読み込みを行うことができます。 実際にnhibernateはdb接続のために実際にado.netを実行しています... – SerialSeb

3

モデルをデータアクセスに依存しない方法で定義する必要があります。リポジトリパターンを使用します。次に、特定のデータアクセステクノロジ(Webサービス、SQLなど)に基づいた具体的な実装を作成できます。

28

MVCアプリケーションがデータベースから切り離される可能性はありますか?アプリケーションのライフサイクルで、SQL ServerからOracleへの変更を見た頻度はどれくらいですか?私が納品した過去10年間のプロジェクトから、決して起こったことはありません。

アーキテクチャはタマネギみたいなもので、依存するものの上に抽象レイヤーがあります。また、RDBMSをストレージに使用する場合は、それがアーキテクチャの中核となります。 DBから自分自身を抽象化して、それをスワップすることは非常に誤りです。

これで、ドメインからのデータベースへのアクセスを切り離すことができ、リポジトリパターンがその方法の1つです。ほとんどの成熟したソリューションは最近ORMを使用していますので、成熟したテクノロジが必要な場合はNHibernate、データの上に単純なアクティブなレコードパターンの場合はActiveRecord/linq2sqlが必要です。

これで、データ戦略が整ったので、ある種のドメインを持っています。クライアントにデータを公開する場合は、通常、レンダリングのためにドメインから生成されたDTOを送信するMVCパターンを使用するか、RESTのようなアーキテクチャスタイルを活用して、より疎結合したシステムを提供するかを選択できますリンクやカスタム表現を提供することにより、

ソリューションの外部レイヤーに向かうにつれて、疎結合から密結合に移行します。

しかし、あなたの質問は、RESTアーキテクチャーやWebサービスの上にMVCアプリケーションを作成し、それをモデルとして使用することでした...どうして迷惑でしょうか?ドメインモデルを使用する場合は、システム内で再利用しないでくださいあなたのサービスは意味がありますか?

MVCアプリケーションからUIを生成し、RESTfulアーキテクチャに必要なドキュメントを生成することは、2つの全く異なるコンテキストであり、互いに重なり合っているということは、必要以上に苦痛を伴うことになります。そしてあなたはパフォーマンスを犠牲にしています。

実際のシナリオにもよりますが、MVCのモデルとしてのリモートXMLベースのサービスによっては、経験から考えてみると、おそらく過度のエンジニアリングであり、ドメインの必要性を無視している可能性があります。

+0

エンタープライズアプリケーションは、どんなベンダーのデータベースも使用できるようになることがますます要求されています。ソフトウェアはそれを実現できるはずです。多くの企業がOracleのライセンスを持っていますが、現在はMySqlに傾いています。 – Liao

+2

スイッチングデータベースを要求することは、高価な抽象化であり、高価なスイッチを必要とします。これは、宇宙飛行士のアーキテクチャの要件の1つで、スイッチが発生したときにはまだコストがかかります。 ほとんどのシナリオでは、1つのデータベースを設計するほうがはるかに優れています。とにかく、スイッチの要件が発生した場合、それはコストがかかります。そして、データベースにとらわれないシナリオの設計よりもコストがかかります。 ORM a la nhibernateを使用しても、矛盾、非互換性、変数ソートなどがあります。 – SerialSeb

+2

MVCアプリケーションをデータベースから切り離すことはできますか? - 私は他のすべてのポスターが、質問の前提条件を反論する(自分が置いた)自己決定モデルに合致しない限り、間違っていると質問する人に、なぜその質問をする必要があるのか​​分かりません。質問自体! – Henrik

0

本当にこのmvcプロジェクトのサイズによって異なります。私は、Webサイトが少数のユーザー(<000)によって使用される場合、同じ実行環境でUIとドメインを維持すると言います。

何百万人ものユーザーがアクセスするサイトを計画している場合は、分散して考える必要があります。つまり、拡大/縮小可能な方法でウェブサイトを構築する必要があります。つまり、余分なサーバー(Web、アプリケーション、データベース)を使用する必要があるかもしれません。

これがうまく機能するには、アプリケーションからmvc UIサイトを切り離す必要があります。アプリケーション層には通常、ドメインモデルが含まれており、WCFまたはサービスバスを通じて公開される可能性があります。私はサービスバスがより信頼でき、msmqのような永続的なキューを使用するかもしれないので、サービスバスを好むでしょう。

私はこれが役立つことを願っています

関連する問題