APIリクエストはMVCのどこに配置すればよいですか?


25

MVCパターンを使用してWebアプリケーションを構築しています。この種のアーキテクチャに従うと、データベースとのやり取りに使用されるすべてのメソッドがモデルに実装されていることがわかります。

しかし、Web上で他の人に公開されているサービスを呼び出さなければならない場合はどうなりますか?たとえば、ページのフォロワーをすべて取得するためにFacebook APIにアクセスしたいので、これらのメソッドをどこに配置しますか?

このモジュールはプレゼンテーション専用であり、コントローラーを使用してデータを取得することはできませんが、モデルは通常データベースとの対話専用であるため、ビューは明らかに良いアイデアではありません。

それで、それについてのヒントを教えていただけますか?そして、MVCアーキテクチャについて間違いを犯していないかどうか教えてください。


2
MVCアプリケーションをサポートするために使用しているライブラリとフレームワークの一部をリストしておけば、人々はより良​​い答えを提供できると思います。MVCパターンはテクノロジーに依存しませんが、すべてのフレームワークが明示的にそれに従うわけではありません。さらに、ほとんどの成熟したフレームワークにはすでに優れたドキュメントがあり、どのフレームワークを使用しているのかを知ることで、考えに沿った既存の説明に簡単に誘導できます。
CLW

2
データベース?情報源?その単なるデータ。

2
「MVC」がどうあるべきかについて非常に多くの意見があり、この質問は抽象的すぎて答えられません。
-RemcoGerlich

2
また、フロントエンドのJavascriptコードからAPIを呼び出し、バックエンドの「MVC」に一切触れないようにすることを検討してください。
-RemcoGerlich

@Remcogerlichは、彼が見ている実際の実装の追加を提案した理由です。彼はmvcのバックエンドとフロントエンドの実装を扱っているかもしれません。これらの違いをより適切に説明する別のパターンを用意することもできます。
CLW

回答:


37

モデルはデータベースとのやり取りに限定されず、モデルはデータの取得と操作を行います。

したがって、ビューとコントローラーにとって、データがデータベースまたはWebサービスから取得される場合、または完全にランダムである場合でも、違いはありません。したがって、モデルで実行する必要があります。

MVCはプレゼンテーションパターンであり、異なる表現レイヤーのみを分離します。

モデルがスパゲッティコードの統一された混乱である必要があることを意味しません。モデル自体も同様に階層化できますが、コントローラーはデータの出所を知る必要はありません。

モデルのパブリックメソッドは、次のように構造化できます(擬似コード)。これは、コントローラーによって呼び出すことができます。

public MyDataClass getData(int id) {
    WebServiceData wsData = WebService->getData(id);
    DatabaseData dbData = ORM->getData(id);
    return new MyDataClass(wsData, dbData);
}

WebServiceまたORM、依存性注入を介してモックに置き換えることができるインターフェイスのインスタンスである必要がありますが、テストのためにコントローラーとビューを変更する必要はありません。


8
モデルにはロジックが含まれていないため、直接何かと対話することはできません。MVCパターンでは、すべてのロジックをコントローラーに配置する必要があります。これらのコントローラーは、DB、APIなどに接続し、必要に応じてモデルを更新する必要があります。これにより、モデルテクノロジーにとらわれず、プレゼンテーション用のさまざまなビューや追加操作用のコントローラーに渡すことができるストレージメカニズムとしてのみ機能します。
CLW

3
@CLW:モデル!=データモデル。詳細は別の場所で見つけることができます。例:stackoverflow.com/a/14045514/124983
レジデュウム

2
@CLW:ビジネスロジックはM、V、または C であってはなりません。モデルはデータストアの抽象化であり、ビューとコントローラーはユーザーインターフェイスです。それらはあなたが構築している実際のアプリケーションの周辺であり、データベースやウェブのようなものを知る必要がない「単なるコード」であるべきです。
-RemcoGerlich

2
「モデル」部分は、何百もの異なる方法で解釈されます。私はいつもモデルは表現であると教えられました。模型列車は、実際の列車のように動く小さな可動部品を備えた、実際の列車の表現です。同様に、アプリのモデルは、置き換えるソフトウェアを構築しているシステムとプロセスの表現です。そのため、モデルには動作があります。この動作には、「ビジネスロジック」が組み込まれています。したがって、純粋なCRUDデータアクセス、UI、および相互運用を無視する場合、おそらく残っているのは「モデル」-ドメインクラス、ビジネスルールなど
-anaximander

1
@RemcoGerlichビジネスロジックについては何も言わなかった。MVCのほとんどの解釈は、アプリケーションの状態を表す単純な構造体にすぎないため、モデルを呼び出す必要があるため、DB、APIなどに連絡する責任は、モデル内に配置する必要があるため、ロジックフリー。データベースとの通信の義務は、コントローラーまたはコントローラーによって管理される別のオブジェクトのいずれかになります。
CLW

12

M、V、Cが何であるかについて、一般的な(意図的な?)誤解があります。ではない彼らは取るが、何の役割についてです、彼らは。

MVCの元のデスクトップGUI定義では、それらはモジュールでした。通常、アプリケーションにはそれらのいくつかがあり、場合によってはトリプレットで動作し、場合によっては少数のコントローラーが混合および適合できるさまざまなビューやモデルがあります。

Webフレームワーク、OTOHでは、それらはレイヤーとして見られる傾向があり、それぞれが1つだけであり、主にいくつかの下位の抽象化レベルをカバーすることを扱います:「モデルレイヤーはデータベースを抽象化」、「ビューレイヤーはプレゼンテーションを実装」、レイヤーはユーザー入力を処理します」。

そのため、データベースとの対話専用のモデルが既にありソースAPIを処理するために別のモデルを作成する必要があると思います。それらを可能な限り類似させると、ほとんどのコントローラーとビューのコードはどちらのモデルでもシームレスに機能します。


1
合意:モデルは常に問題領域全体であると想定されていました。複雑なアプリでは、常にコードの大部分であると想定されていました。これらは、ユーザーインターフェイスを変更しても変更されないすべてのコードで構成されています(たとえば、WebサイトからGUI、またはコマンドラインアプリケーションに変更されます)。コンパイラを考えてください。コマンドラインUIからGUI、またはWeb UIに移行した場合、コードのごく一部のみが変更されます。そのようなアプリケーションの基本はすべてモデルです。
ケビンキャスカート

1
Smalltalkの元の用語の使用では、インターフェイスのすべてのUIコントロールに独自のモデル、ビュー、およびコントローラーがありました。
-RemcoGerlich

5

MVCの議論の難しさの一部は、異なるグループが異なることを意味するためにそれを採用したことです。たとえば、Railsアプリで使用されるMVCの実装は、Swingアプリを書いている人にはほとんど認識できません。MVCがまだ明確に定義されているものである限り、それは一連のガイド原則(コアアプリケーションを視覚的表現から分離し、柔軟なメカニズムを提供して2つを一緒に組み込むことができます)であり、さまざまな方法で実装できます方法。

確かに、異なるMVC派生デザインに異なる名前を付ける傾向があります(これについての議論についてはMartin Fowlerによるこの記事を参照してください)、または正確な命名をあきらめることさえあります-たとえば、AngularJSはModel-View-Whateverとして説明しますフレームワーク。

そのため、使用している「MVC」のバージョンを知らずに答えることは困難です。ただし、APIリクエストは通常​​、コアアプリケーションの一部(別の視覚的表現を使用する場合に変更すべきではない部分)であり、多くの実装では完全にモデル内に含まれます。


2

ここで、モデルは次のように説明されます。

モデルには、コントローラーに取得され、ビューに表示されるデータが保存されます。データに変更があるたびに、コントローラーによって更新されます。

コントローラーには、サービスを呼び出すロジックが含まれているか、別のServiceオブジェクトを呼び出していると思います。サービスが分離されている場合は、より簡単にテストを作成できます。たとえば、ネットワークを介したサービスへの接続が不可能な場合、一部TestServiceServiceローカルからの応答を提供できます。

また、コントローラーがサービスを呼び出すことを示唆するこの回答を確認してください。


2

モデルには実際のコードを含めることはできません。また、コントローラーによって操作され、ビューによって表示されるコンテンツを管理するために使用される、より多くのメッセージまたは構造体として表示される必要があります。

コントローラーは、API、データベース、サービスなどと連絡を取り、変更を要求し、モデルの必要な更新を管理する必要があります。

MVCパターンの全体的な強みは、ロジック(コントローラー)をビューと状態(モデル)から切り離すことです。そうすることで、ビューとモデルが単に変更を許可されないため、コントローラーのコードのみが副作用を作成できることが保証されます。

また、モデルをさまざまなコントローラーとビューの間で共有できるため、コードの再利用が改善されます。


4
ここで「モデル」と言うときは、「viewmodel」を指していると思いますが、これはIMOとは別のものです。ビューモデルは、コントローラーからビューにデータを取得します。ビューモデルは、ビューの実装の詳細、またはビューとコントローラー間の通信のどちらかであり、実際にはどちらにも適合しません(表示方法によって異なります)。MVCの「モデル」とは、システムモデル(データ、構造、および動作を組み込んだシステムの表現)を指します。モデルは状態とロジックです。コントローラは、ビューが操作されたときにロジックを実行し、状態を変更するものです。
アナキシマンダー

@anaximanderいいえMVCのかなり厳密な解釈でモデルを参照しています(Wikipedia、Microsoft MVC、Head First Designパターンなどを参照してください)。これらのインスタンスでは、モデルはデータを渡すための単純な構造にすぎません周りにはビューモデルのようなものはありません。Microsoft MVC実装はさまざまな属性をモデルに追加しますが、これは何よりも便利です。最終的に、MVCパターンの目的は、コード分離の優れた実践を促進し、副作用を制限することでした。
CLW

1

ここからは少し外れているかもしれませんが、多くの場合、これがWebAppsと[複雑な]リモートAPIの操作について私が感じる方法です。

モデル(つまり、データ軽減関数のスタック)ではなく、クラス(つまり、データ軽減メソッドのライブラリ)にします。それはより透明で、よりロジック/スキーマにとらわれないように見え、ロードすることなくどこでも使用できます->使用するたびにモデル/コントローラ自体を呼び出します。ロジックはまだ分離されており、データポイントは依然として柔軟性があり、クライアントAJAX-> appJSON-> appLIB-> remoteAPI-> remoteJSONなどをスタックしてエンドポイントを間接的にポーリングするなどの奇妙なケースでは、相互運用性がよりオープンになっているようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.