71

私はwebapiを学び始めており、MVCプロジェクトでは意味があるが、意味をなさないかもしれないことをしていることに気づきました.

通常、MVC プロジェクトでは ViewModel を作成し、それをパラメーターとして使用するか、ビューでそれらを返します。

webapi にはビューがないため、ViewModel をパラメーターとして使用しても意味がないと思います。

パラメータとしてEFドメイン(コードが最初)を持ち、これらの上にデータ注釈を配置する必要があるかどうか疑問に思っています。ドメイン上でこれが好きだったので、通常はビューモデルのプロパティの上に注釈を付けます。

ただし、これを行うのを妨げているのは、MVC サイトがどのように機能するかが 100% 明確ではないことです。

MVC サイトは単純なビューを吐き出し、Jquery を使用して webapi を呼び出しますか、それとも Webapi が呼び出すのと同じメソッドを直接呼び出す MVC アクション メソッドを呼び出すだけですか?

2 番目の方法の場合は、ビュー モデルにデータ注釈を再度配置しますが、EF ドメインと VM の両方に同じ注釈を配置しているため、冗長に見えます。

4

5 に答える 5

46

この「もの」を長時間使用した後の私の提案:

データ バインディング用のBindingModels (mvc または api)

mvc のビュー用のViewModel (API 内にいくつかの mvc ページがある場合があるため、このための場所を用意しておくとよいでしょう。これは、ドキュメント、紹介ページなど、何でもかまいません。ビューがない場合は、ViewModel をゼロにすることができます) 1 つこれの利点は、Views/web.config で ViewModels 名前空間の参照を持つことができ、API リソースで汚染されないことです。

Web API リソースの ResourceModel webapi では、ネストされたリソースはツリー内のどこにでもあるリソースでもありますが、mvc ではそれほど一般的ではないため、リソースに名前を付けるのは非常に理にかなっています。

リソースを受け取りたい場合は、リソース モデルを使用できます。あなたが送っているのと同じものを受け取っていることを忘れないでください。

入力用のカスタム バインドが必要な場合 (これが既定のシナリオです)、バインド モデルが用意されています。

管理目的、ドキュメントなど、mvc ビューがある場合は、ViewModels を使用します。

mvc にフォーム ページがある場合は、BindingModel を POST コントローラーでも使用できます。MVC や WEBAPI への投稿用に別のモデルを用意する必要はありません。特に、モデル バインダーまたはフォーマッターが、同じデータ注釈を使用して同じバインディング モデルを理解し、マッピングできる場合。

場合によっては、リソースといくつかの追加フィールドを使用してバインド モデルを作成する必要があります。継承はあなたの友達です。

場合によっては、複数のリソースと (オプションで追加のフィールド) リソースをプロパティとして持つバインド モデルを作成したいことがあります。

MVC の世界では、「リソース」の概念も使用できますが、あまり一般的ではありません。これは、同じプロジェクトに MVC と Web Api がある場合に便利です。

項目 (フォルダー構造、名前空間など) についてさらにコメントが必要な場合は、お知らせください。短所の長所の経験を共有できることを嬉しく思います。

ああ、忘れていましたが、マッピング戦略は研究する価値があります。私は個人的に独自のマッピングを行っていますが、このロジックを 1 か所にまとめることは非常に貴重です。

編集:非常に素朴な例

ContactViewModel{

    string Name {get;}
    string LastName {get;}
    List<Country> AvailableCountries {get;}
    Country Country {get;}
    bool IsAdmin {get;}

}

ContactBindingModel{

    string Name {get;set;}
    string LastName {get;set;}
    int Country {get;set;}

}

ContactResourceModel{

    string Name { get;set;}
    string LastName {get;set;}
    Country Country {get;set;}
    string IsAdmin {get;}

}
于 2014-08-06T22:35:01.687 に答える
37

用語はさておき、バインディング用のモデルを持つことは依然として使用されています。ビューが関係していないという点で、それらは技術的にはもはやViewModelではありません。しかし、それらは間違いなくまだ使用されています。それらを使用すると、モデルのプロパティの属性を利用でき、必要に応じて API 全体で再利用できます。また、エンティティを直接使用する場合、意図していなくても、WebAPI は名前で一致するすべてのパラメータをエンティティにモデル バインドすることを忘れないでください。

また、エンティティ モデルは生データの表現ですが、バインドに使用されるモデルは、API 要求が要求を正常に処理するために満たす必要がある固定契約です。実装が完了するまでに複数のエンティティ モデルにまたがる可能性があり、データ ストアにまったく永続化されない値。

于 2013-05-03T19:08:21.733 に答える
8

REST ベースのシステムを構築しようとしている場合は、ViewModel と View の概念が非常に役立ちます。Resource の概念を ViewModel に、表現を View にかなり密接にマッピングできます。

MVC サイトでビューがどのように見えるかについて少し考えてみてください。HTML文書です。一連のセマンティック情報、タイトル、本文、セクション、段落、表などを含むドキュメント。「スタイル」情報を含むことは想定されていません。それが Web ブラウザと CSS の仕事です。HTML を UI と考え始めると、人々は混乱します。UI のはずではなく、UI のコンテンツです。

ビューは、ネットワーク経由で転送できる何らかのメディア タイプを使用して、ビュー モデル コンテンツを具体的に実現したものにすぎません。そのメディア タイプが何であるかは、満足させようとしているクライアントによって異なります。

于 2013-05-03T19:55:44.773 に答える