2011-06-19 21 views
0

現在、準大型MVC 2プロジェクトで作業しており、関連するビューとビューモデルを持つコントローラーの数がかなり大きくなっています。ちょっとした分離を試みるために、私はMVC 2の領域機能を使用してそれに応じてプロジェクトをリファクタリングする方法を検討してきました。ベースコントローラーを継承する各領域のコントローラーで複数の領域を設定する - MVC

私が直面している問題の1つは、具体的なコントローラで使用する機能とプロパティを共有するためにコントローラの継承階層を持っていることです。

は、基本的に我々は現在、とても私たちのメインコントローラフォルダのように設定している:私は、つまり各作業コントローラの作成エリアを考えています

Controller (MVC) 
+-- BaseController (Abstract) 
     +-- BaseWorkController (Abstract) 
      +-- BaseWorkAController (Abstract) 
       +-- ... a number of controllers exposing actions 
      +-- BaseWorkBControllers (Abstract) 
       +-- ... a number of controllers exposing actions 

  • エリア/ WorkA
  • エリア/ WorkB

各領域には関連するビューとビューモデルがあります。 d偶数モデル。

しかし、私が直面しているような問題は、どこにBaseWorkControllerを配置するかということです。メインの「コントローラー」フォルダーにそれを残しても構いません。エリアコントローラーにはそのコントローラーへの参照が含まれています。また、異なる領域のコードは、異なるモデルや、特定の機能のために作成するいくつかの属性へのアクセスを必要とするかもしれません。

この設定は、領域の使用が許容されているようです。私が読んできたことから、私が探しているものは、分離した懸念と機能性に役立つようです。しかし、それが機能の完全な間違った使用である場合、私はこれを行うために投資したくないですか?

コントローラコードは、他の領域またはメインコアコントローラ/モデル/ビューフォルダの機能を使用することは許容されますか。

答えて

2

あなたのアプリケーションの継承量は私には警告です。あまりにも多くの共有動作がある場合は、コントローラ自体から取り出して共有ロジックをカプセル化するクラスを作成し、継承ではなくコンポジションを使用してコントローラの機能を拡張することを検討する必要があります。

質問に答えるために、ベースコントローラから他の領域のコントローラにロジックを共有することに問題はありません。そうすることが理にかなっている場合。しかし、継承チェーンの中でいくつかの層を深く理解し始めるなら、コードを見直して、共有ロジックが複数のオーバーライドを複雑にするよりも、別の共有クラスで理に適っているかどうかを検討することを強く検討します。

異なるレベルで動作を上書きする場合は、戦略パターンを調べるとよいでしょう。このパターンを使用すると、継承ではなく、コンポーネントの振る舞いをスワップして合成を使用することができます。

+0

私は木が非常に深いと認めます。この機能の多くは、必要に応じて継承するコントローラによって使用される追加のメソッドであり、通常は保護されたメソッドです。彼らは特に大きなものではありません。特にBaseWorkAControllerなどです。私はこれをどのようにリファクタリングできるのか分かりませんが、私はこのレベルを取り除くことができるかもしれませんので、提案されたパターンを見ていきます。ありがとう。 – dreza

関連する問題