47

私は MVC フレームワークをしばらく使用していますが、懸念事項がどのように分離されているかが本当に気に入っています。私は、コントローラーにかなりの作業を任せるという悪い習慣に陥っています。だから私は本当にいくつかのアドバイスを探しています。

私が MVC を使い始めた当初は、データベースの作業が完了した後で、コントローラーがモデルを操作することがよくありました。私はこれが悪いことを知っていたので、モデルに働きかけました。ただし、モデルを非常に学習させたいので、これには満足していません。

私は少し読んだことがありますが、私が気に入っているサービスレイヤーを使用することで、人々がコントローラーとモデルをスリムに保っていることがわかります。

サービスレイヤーとリポジトリがどのように連携するかを理解しようとしています。これが私の仮定です。これが良い方法であるかどうか教えてください。

  1. データに対して操作を行う必要がなく、そのようなサービス層が関与する必要がない場合、コントローラはリポジトリを直接呼び出すことができます。
  2. データ (ビジネス ロジック) に対して何らかの作業を行う必要がある場合、これはサービス レイヤーで実行する必要があり、コントローラーは必要に応じてサービス レイヤーへの単純な呼び出しを行います。
  3. サービスがビジネス ロジックを完了すると、必要に応じてリポジトリが使用されます (データを永続化する必要がある場合)。
  4. モデルは理想的には無駄のない状態に保ち、理想的には DTO に過ぎないものとして機能する必要があります
  5. データの検証はモデル内で行われます (MonoRail 検証属性を使用)。多くの属性でモデルを汚染するのが好きな人はいないと思いますが、それは別の議論です. UI での自動 jQuery 検証に対する MonoRail の検証属性の利点が気に入っています。

私はすべてのコードを単一責任の原則に変えようとしているため、コーディングの慣行を整理しようとしています。

ありがとう

4

3 に答える 3

26

まず、すべての状況で機能する一連のルールはありません。アプリケーションをどのようにモデル化するかは、プロジェクトの種類と複雑さに大きく依存します。そうは言っても、ここにいくつかのアイデアがあります:

  1. コントローラーからリポジトリを呼び出すことに問題はありません。コントローラーにビジネスロジックが含まれていないことを確認してください。
  2. このサービスは (一部の) ビジネス ロジックを処理し、他のサービスを使用して処理します。リポジトリはサービスの一種であり、サービスから呼び出すことに問題はありません。
  3. モデルにはビジネス ロジックが含まれている必要があります。実際には、常に最初にモデルに配置するようにしてください。そのビジネス ロジックを (別のモデルまたはリポジトリから) 実行するために外部データが必要な場合は、サービスを作成する必要があります。
  4. モデルの検証に問題はありません。属性を使うか使わないかは好みの問題です(好きならそれでいいです)。検証が複雑になりすぎる場合は、検証をモデルの外に移動します (外部ルール セットを作成します)。

最も重要なことは、正しいと思われることを行うことです (通常、これが正しい答えです)。

于 2008-11-28T15:53:21.037 に答える
7

このビデオでは、asp.net MVC ソリューションを整理し、懸念事項の分離に対処する方法、およびテスト容易性を向上させる方法について、優れた洞察を得ることができます。うまくいけば、それは他の誰かにも役立つでしょう。私はそれからいくつかの良いことを学びました。

于 2012-10-01T21:31:14.473 に答える
6

Ian Cooper は、まさにこのテーマについてThe Fat Controllerというブログ記事を書いています。

于 2008-12-04T14:57:45.653 に答える