2012-02-17 6 views
3

<Person>オブジェクトのコレクションを取得できるWCF Webサービスがあるとします。私の質問は、Webサービス、コントローラ、またはモデルを呼び出すコードをどこに置くべきかです。私の2番目の質問は、自分のモデルフォルダに自分自身の<Person>クラスを作成するか、.NETプロジェクトでサービス参照を追加したときに自動的に生成されるものを使用するだけですか?MVCフレームワークのModelクラス内でWebサービスを呼び出す必要がありますか?

答えて

3

通常、コントローラーに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パターン自体で規定されていない他のクラスを使用することができます。

これは私のコメントですべて意味していました。再び、私はそれが最高の言葉による発言ではないことを認識します。ごめんなさい。

+0

ビューに送信するために他のものに変換する必要がある場合(フィールドの検証や複数のモデルを組み合わせるためのメタマークアップの追加など)は、ViewModelと呼ばれます。私は、ViewModelを使用することはMVCパターンの外にあるとは言いません。データベースエンティティまたはWebサービスエンティティをモデルとして使用したくない状況が数多くあります。 –

+0

一般に、データアクセスコードはMVCパターンのどこにあるべきですか? – nobody

+0

@ Splash-X:私はそれほどうまく言わなかったと思います。私が意図したことは、コントローラがViewModelのトランスフォーマ/トランスレータへの何らかの 'DataModel'呼び出しを行い、その"トランスフォーマ "クラスがモデル、ビュー、またはコントローラではないということでした。混乱させて申し訳ありません。 @qin:通常、私は実際のデータベースを抽象化する何らかの種類の 'Repository'を通して、コントローラにデータをロードさせます。 – CodingWithSpike

0

ControlerからWCFを呼び出すことは本当です。あなたのモデルがサービスに依存しているというモデルのサービスを呼び出す場合、これはMVCの使い方ではありません。モデルはサービスに依存してはいけません。コントローラーの最善の選択からの呼び出し

0

それは本当にあなたがそれを取得した後にデータで何をしたいかによって決まります。

データベースに入れることを計画している場合は、コントローラーまたはモデルではなく、下位レイヤーで実行する必要があります。

これをページにすぐに表示する予定の場合(つまり、サービスからデータを取得してモデルに追加する場合)、コントローラからサービスを呼び出すことができますが、私の個人的な好みは、特にあなたが他のコントローラからこれを行う必要があるかもしれないので、コントローラを混乱させることなく、すべてのコミュニケーションの混乱を扱うことができる別のクラス。

モデルに明示的に関連していないコード(検証のような場合もあります)は、モデルには含まれません。モデルをビューに出し入れするためのコードではなく、モデルのさらなる処理を行うために下位層を呼び出すことは、コントローラに属さない。

関連する問題