Derik Whitakerが article を数日前に投稿しましたが、それは私がしばらく気になっていた点にぶつかりました:コントローラーにビジネスロジックが存在すべきか?
これまで、私が見たすべてのASP.NET MVCデモでは、コントローラーにリポジトリアクセスとビジネスロジックを配置しました。そこに検証を投げる人もいます。これにより、かなり大きく肥大化したコントローラーが作成されます。これは本当にMVCフレームワークを使用する方法ですか?これは、多くの複製されたコードとロジックが異なるコントローラーに広がってしまうだけのようです。
ビジネスロジックは実際にモデルに含まれている必要があります。脂肪モデル、スキニーコントローラーを目指してください。
たとえば、次の代わりに:
public interface IOrderService{
int CalculateTotal(Order order);
}
私はむしろしたい:
public class Order{
int CalculateTotal(ITaxService service){...}
}
これは、税金が外部サービスによって計算されることを想定しており、モデルが外部サービスへのインターフェースについて知る必要があります。
これにより、コントローラーは次のようになります。
public class OrdersController{
public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...}
public void Show(int id){
ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService);
}
}
またはそのようなもの。
Microsoft Patterns&Practices で表示される図が気に入っています。そして、「絵は千の言葉に値する」という格言を信じています。
サービス層による検証 を示すStephen Waltherによるこの素晴らしいチュートリアルを確認できます。
検証ロジックをコントローラーアクションから別のサービスレイヤーに移動する方法を学びます。このチュートリアルでは、Stephen Waltherが、サービスレイヤーをコントローラーレイヤーから分離することで、懸念事項を明確に分離する方法を説明します。
これは興味深い質問です。
興味深いのは、多数のサンプルMVCアプリケーションが、実際にモデルに完全に「ビジネスロジック」を配置するという意味で、MVCパラダイムに従わないことです。 Martin Fowlerは、MVCはGang Of Fourの意味でのパターンではないことを指摘しています。むしろ、プログラマーがパターンを追加する必要があるのがパラダイムですtoおもちゃのアプリを超えて何かを作成している場合。
したがって、簡単な答えは、「ビジネスロジック」は実際にはコントローラー内に存在するべきではないということです。コントローラーにはビューとユーザーインタラクションを処理する追加機能があり、1つの目的のみでオブジェクトを作成するためです。
より長い答えは、ロジックをコントローラーからモデルに移動する前に、モデルレイヤーの設計にいくつかの考えを入れる必要があるということです。おそらく、RESTを使用してすべてのアプリロジックを処理できます。その場合、モデルの設計はかなり明確でなければなりません。そうでない場合は、モデルが肥大化しないようにするためにどのアプローチを使用するかを知っておく必要があります。
ビジネスロジックをコントローラーに含めることはできません。コントローラーはできるだけ細く、理想的にはパターンに従う必要があります。
さらに、コントローラーにはアプリケーションロジックを含めることができます。
では、ビジネスロジックをどこに配置すればよいのでしょうか?モデルで。
モデルとは?これはいい質問です。 Microsoft Patterns and Practicesの記事 (優れた検索についてはAlejandroRに感謝します)を参照してください。ここには、モデルの3つのカテゴリがあります。
もちろん、MVCはさまざまな種類のパラダイムです。ここで説明するのは、MVCが最上位レイヤーのみを占有していることです Wikipediaのこの記事
現在、MVCおよび同様のモデルビュープレゼンター(MVP)は、大規模システムのプレゼンテーション層にのみ適用される懸念の分離デザインパターンです。単純なシナリオでは、MVCはシステムの主要な設計を表し、データベースに直接到達します。ただし、ほとんどのシナリオでは、MVCのコントローラーとモデルは、サービスまたはデータレイヤー/層に緩やかに依存しています。これは、すべてクライアントサーバーアーキテクチャに関するものです