Webアプリケーションを作成するとき、コントローラーにビジネスロジックを配置します。これは私の小さなアプリ開発チームにとってはうまく機能しました。私たちのアプリケーションは確実に実行され、うまく機能し、コードの保守も簡単です。私のデザインの説明については、以下を参照してください。
私のアーキテクチャとは対照的に、私がプログラミングフォーラムで見つけたアドバイスは、通常、ビジネスロジックをモデルに配置することを推奨しています。 なぜを理解したいのですが。
MVC + SOAアプリケーションを構築した経験に基づいて、コントローラーにロジックを配置することに対して警告し、モデルにロジックを配置することを推奨するのはなぜですか?理論的根拠は何ですか?私のデザイン?
私のデザインは Refit 、タイプセーフREST C#のプロキシ)の使用に影響されていることを認めます。ビジネスロジックを配置したくない理由の1つモデル(またはエンティティ)では、サービスインターフェイスとエンティティをコントラクトで定義しているためですDLLサービス(WebAPI)とクライアント(MVC Webサイトまたはコンソールアプリケーション)によって共有されます)。 (エンティティのLoad、Save、Approve、Rejectなどのメソッドを介して)データ永続性の詳細をクライアントに漏らしたい。
もう1つの影響は、これらの使い慣れた設計原則の矛盾を解決したいという私の願望から生じます。
「ビジネスロジック」にSQLまたはCMSステートメントが含まれている場合、原則は矛盾します。 「ビジネスロジック」にSQLまたはCMSステートメントが含まれていない場合、これはさらに別のレイヤーであるデータ転送オブジェクト(DTO)の導入を意味します。ああ、別の層ではありません。
また、最後の人気のパラダイムからの慣性により、オブジェクト指向(OO)デザイン(オブジェクトがすべて)がMVC + SOA=)の世界に忍び込んでいるように感じます。したがって、ビジネスを配置するためのアドバイスモデル内のロジック(オブジェクト)。
わかりました、十分な紹介。これが私のMVC + SOAアーキテクチャ(Microsoftスタックの場合)です:
MVC =モデルビューコントローラ、SOA =サービス指向アーキテクチャ
事業体
根拠
Model-View-Controllerパターンは、いくつかの基本原則に従うUIパターンです。
ビューはユーザーインターフェースであり、コントローラーの前にある薄いベニアです。ビューにある必要がある唯一のロジック(つまり、「コードビハインド」)は、ユーザーとの対話に直接関係するロジックです。
コントローラは、モデルの前にある薄いベニアです。スイッチヤードとして機能し、ビューからモデルへのリクエストを処理のために分路します。コントローラ内にあるべき唯一のロジックは、この通信を容易にするロジックです。
モデルには、データアクセスレイヤー(この場合はDapperまたはEntity Framework Code)、リポジトリレイヤー(エンティティとCRUDメソッドを含む)、およびビジネスロジックを含む、アプリケーションに関するその他すべてが含まれます。レイヤー
このように説明された全体的なアーキテクチャは、次のようになります。
Database --> Data Access Layer --> Repository --> Business Layer --> Controller --> View
矢印は依存関係の知識の方向を示しています。例えばビューはコントローラーを認識していますが、その逆は認識していません。
ビジネス層は、CRUD /ビジネストランザクションコンバーターと考えることができます。左側では、リポジトリのエンティティを使用して、作成、読み取り、更新、削除を行います。右側では、ビジネスオペレーション(「請求書の印刷」や「顧客への請求」のようなもの)を、私が呼ぶView Modelオブジェクトを使用して説明します。これらのビューモデルオブジェクトは、UIを基になるデータ表現に接着するためにコントローラーが使用するものです。
私の例では、ビジネスレイヤーがコントローラーから抽象化されていることに注意してください。 これにより、同じビジネスレイヤーで異なるコントローラーを使用できます。