<Person>
オブジェクトのコレクションを取得できるWCF Webサービスがあるとします。私の質問は、Webサービス、コントローラ、またはモデルを呼び出すコードをどこに置くべきかです。私の2番目の質問は、自分のモデルフォルダに自分自身の<Person>
クラスを作成するか、.NETプロジェクトでサービス参照を追加したときに自動的に生成されるものを使用するだけですか?MVCフレームワークのModelクラス内でWebサービスを呼び出す必要がありますか?
答えて
通常、コントローラーにWCFサービスを使用してデータを読み込ませます(データをロードする場合もあります)。より複雑なアプリケーションでは、WCFが返すもの(データ転送オブジェクト)を実際に "MVC"パターンの外にあるモデルに変換するものが必要になるでしょう。
Nerd Dinnerの例を確認して、コードの整理方法を確認できます。これは、非常にうまく構造化されたMVC3アプリケーションの「実世界」の例を意図していました。
また、Hanselmanは、データアクセスの異なるスタイルを行ったいくつかの異なるNerdDinnerフォークのロールアップレビューを持っていますon his blog。用
コードスニペット@スプラッシュ-Xコメントは何だった私は、「MVCパターンの一部ではない」の間で取得しようとしていた
その時々のDataModel(どのDBまたはWCF戻ります)、(あなたが見るに送ること)のViewModelと同じではないので、時々、あなたは、モデルの間で変換する何かを必要とする場合があり、同様に:
public interface ITransformer<out To, in From>
where To : class
{
To Transform(From instance);
}
public class SomeDataToSomeViewModelTransformer : ITransformer<SomeViewModel, SomeDataModel>
{
public SomeViewModel Transform(SomeDataModel instance)
{
return new SomeViewModel
{
InvitationId = instance.Id,
Email = instance.EmailAddress,
GroupId = instance.Group.Id
};
}
}
どれでも私のコメントは "という事を意味することを意図していましたモデル間の変換はdicではありませんMVCパターンに基づいています。または、より一般的には、あなたがの3つのクラスタイプを持つことができることを意味するMVCに従っているからといって、それを感じないでください。いいえすべては、モデル、ビューまたはコントローラです。コントローラは、MVCパターン自体で規定されていない他のクラスを使用することができます。
これは私のコメントですべて意味していました。再び、私はそれが最高の言葉による発言ではないことを認識します。ごめんなさい。
ControlerからWCFを呼び出すことは本当です。あなたのモデルがサービスに依存しているというモデルのサービスを呼び出す場合、これはMVCの使い方ではありません。モデルはサービスに依存してはいけません。コントローラーの最善の選択からの呼び出し
それは本当にあなたがそれを取得した後にデータで何をしたいかによって決まります。
データベースに入れることを計画している場合は、コントローラーまたはモデルではなく、下位レイヤーで実行する必要があります。
これをページにすぐに表示する予定の場合(つまり、サービスからデータを取得してモデルに追加する場合)、コントローラからサービスを呼び出すことができますが、私の個人的な好みは、特にあなたが他のコントローラからこれを行う必要があるかもしれないので、コントローラを混乱させることなく、すべてのコミュニケーションの混乱を扱うことができる別のクラス。
モデルに明示的に関連していないコード(検証のような場合もあります)は、モデルには含まれません。モデルをビューに出し入れするためのコードではなく、モデルのさらなる処理を行うために下位層を呼び出すことは、コントローラに属さない。
- 1. MVCフレームワークのコントローラまたはモデル内からredirect()を呼び出す必要がありますか?
- 2. jquery内でクラス名を呼び出す必要があります
- 3. リポジトリは別のリポジトリを呼び出す必要がありますか?あるいは、リポジトリがサービス層を呼び出す必要がありますか?
- 4. このXMLを返す私は、Webサービスを呼び出す必要がWebサービス
- 5. コードビハインドファイルでValidate()を呼び出す必要がありますか?
- 6. ARCでdispatch_releaseを呼び出す必要がありますか?
- 7. UITableViewCellでdeinitを呼び出す必要がありますか?
- 8. DialogFragmentをAsyncTaskクラスから呼び出す必要がありますか?
- 9. 異なるクラスのメソッドを呼び出す必要がありますか?
- 10. viewDidLayoutSubviews()内でlayoutIfNeededを呼び出す必要がありますか?
- 11. componentWillReceiveProps内でアクションを呼び出す必要がありますか?
- 12. Web APIとレンダリングテンプレートは、同じ関数呼び出しで呼び出す必要がありますか?
- 13. UIスレッド内からLooper.prepare()を呼び出す必要がありますか?
- 14. "WebSecurity"クラスの他のメソッドを呼び出す前に "WebSecurity.InitializeDatabaseConnection"メソッドを呼び出す必要があります
- 15. TForm.ManualDockはonFormShowを呼び出す必要がありますか?
- 16. Graphics.Dispose()を呼び出す必要がありますか?
- 17. いつjava.sql.Connection.rollback()を呼び出す必要がありますか?
- 18. [convertToGl]を呼び出す必要がありますか?
- 19. なぜresolve()を呼び出す必要がありますか?
- 20. いつsetContentAspectRatioを呼び出す必要がありますか?
- 21. GLSurfaceView:onPause/onResumeを呼び出す必要がありますか?
- 22. SqlTransactionはDisposeを呼び出す必要がありますか?
- 23. クローズ接続を呼び出す必要がありますか?
- 24. いつMessageQueue.EndReceive()を呼び出す必要がありますか?
- 25. 毎回FacebookSdk.sdkInitialize()を呼び出す必要がありますか?
- 26. Webサービス内からWebサービスを呼び出す方法
- 27. Webサービスを呼び出すためにlocalhostサーバーが必要ですか
- 28. PhoneStateListenerでアクティビティを呼び出す必要があります
- 29. onDestroy()でthread.joinを呼び出す必要があります
- 30. realm.close()はいつ呼び出す必要がありますか?
ビューに送信するために他のものに変換する必要がある場合(フィールドの検証や複数のモデルを組み合わせるためのメタマークアップの追加など)は、ViewModelと呼ばれます。私は、ViewModelを使用することはMVCパターンの外にあるとは言いません。データベースエンティティまたはWebサービスエンティティをモデルとして使用したくない状況が数多くあります。 –
一般に、データアクセスコードはMVCパターンのどこにあるべきですか? – nobody
@ Splash-X:私はそれほどうまく言わなかったと思います。私が意図したことは、コントローラがViewModelのトランスフォーマ/トランスレータへの何らかの 'DataModel'呼び出しを行い、その"トランスフォーマ "クラスがモデル、ビュー、またはコントローラではないということでした。混乱させて申し訳ありません。 @qin:通常、私は実際のデータベースを抽象化する何らかの種類の 'Repository'を通して、コントローラにデータをロードさせます。 – CodingWithSpike