web-dev-qa-db-ja.com

ASP.NET MVC-MVCのM、V、Cはドメインエンティティを明示的に認識する必要がありますか?

この質問はかなり主観的なようですので、ここに投稿します。

ASP.NET MVCを使用して独自のバージョンのStackoverflowを作成しているとしましょう。そのため、QuestionAnswerUserなどのクラスがあります。 、エンティティフレームワークを使用することにしました。したがって、上記のすべてのクラスにはナビゲーションプロパティがあります:QuestionはそのAnswersを知っており、Answerは投稿者Userを知っています。

Martin Fowlerの本をたくさん読んだので、すべてのビジネスロジックを実装するためのサービスレイヤーを必ず用意します。 ASP.NET MVCは、UIおよびアプリケーションロジック関連の機能にのみ使用します。

2つの質問があります。

  1. QuestionAnswerなどのオブジェクトをコントローラーに直接公開しますか?
  2. ビューに対しても同じことをしますか?

私は基本的にREST APIをアプリケーションに提供するつもりもありません。また、「ちょっと、MY VIEWはQuestionは、それが悪いかどうかわからない、ただ気に入らないだけです。」.

QuestionクラスにTimePostedのようなフィールドがあり、PostNewQuestionビューをそのクラスにバインドする場合に特に興味があります。そのフィールドをページ上のコントロールにバインドしない場合は、投稿されないので、コントローラー側でオブジェクトを取得すると、そのフィールドがnullに設定されます。 。それは大丈夫ですか、それとも悪い考えですか?私が考えている2つの反対のアプローチは、「どこでもDTO/ViewModelを使用すること」と「wtf、クラスが少ないほど常に良いことです!」

正しいアプローチとは何だと思いますか? (私は直接的な答えがないことを知っているので、実際の質問は、「アプリのアーキテクチャにDTO/ViewModels /他に何がgoodを使用するかを決定するために何を考慮すべきか?」)

また、Stackoverflowの非常に簡略化されたクローンを検討していることにも注意してください。

  1. これはWebのみのプロジェクトです(REST APIやその他のものは公開しません)
  2. ユーザー、質問、回答、タグ、検索機能があります(優れたビジネスロジックはありません)
  3. 1日あたり100人ほどのアクティブユーザーがいます(特別なパフォーマンス要件はありません)
  4. 新しいメンバーが開発チームに加わった場合でも、コードは読みやすく、驚きや特別な場所はないはずです。

また、最初の3つのポイントが変更された場合の考えを表明することもできます-「顧客は、10000人の同時ユーザーを許可するサービスを望んでいる」または「すべてのユーザーが15分に1回だけ投稿できるようにする必要がある」など。

ありがとう!

8
Andrey Agibalov

私はMVCをあまり使用していませんが、MVVMを使用して多くの作業をしてきました。

QuestionAnswer、およびUserはすべてデータオブジェクトです。彼らがお互いを知ることは問題ありませんが、ビュー、コントローラ、ビューモデルなど、データオブジェクトレイヤの外側にあるものは何も認識してはなりません。

理想的な世界では、ビューはモデルのみを参照します。彼らはコントローラーを知っているかもしれませんが、直接参照する必要はありません。 ViewModelは他のモデルのみを認識します。コントローラは、モデルとビューモデルを認識しています。ビューにViewModelsまたはModelsを提供しますが、ビューはまったく気にしません。

したがって、オブジェクトは次のようになります。

  • [〜#〜] m [〜#〜]オデルには、ModelsとViewModelsの2種類があります。

    • モデルは単純にデータを保持するために存在する単純なデータオブジェクトであり、一般にデータベースデータを反映しています。彼らはデータベースにアクセスしたり、彼らとは無関係のあらゆる種類のビジネスロジックを含んでいません。
    • ViewModelは、ビューが必要とするデータを含むデータオブジェクトであり、必ずしもデータベースが必要とするものではありません。モデルにはViewModelを含めることはできませんが、モデルを含めることができます。
  • [〜#〜] c [〜#〜]オンローラーにはビジネスロジックが含まれています。これらは、データアクセス呼び出しを制御し、ビューに渡すモデル/ビューモデルを作成し、アクセス許可などの高度なビジネスロジックなどを制御します。基本的に、コードレイヤー全体を制御します。

  • [〜#〜] v [〜#〜] iewsは、ユーザーに使いやすいインターフェイスを提供するために使用されます。それらはViewModelまたはModelのいずれかを受け入れ、ユーザーにとって見栄えのよい方法で表示します。

3
Rachel