2008-09-16 9 views
0

私は、複数の部門で使用されるヘルプデスクアプリケーションを開発しています。アプリケーションのすべてのURLには、特定の部門を示すキーが含まれます。キーは常にシステム内のすべてのアクションの最初のパラメータになります。例MVC要求ごとにモデルを取得する

http://helpdesk/HR/Members 
http://helpdesk/HR/Members/PeterParker 
http://helpdesk/HR/Categories 
http://helpdesk/Finance/Members 
http://helpdesk/Finance/Members/BruceWayne 
http://helpdesk/Finance/Categories 

についての問題は、各リクエストに応じてそれぞれのアクションで、私は、このパラメータを取ると、そのキーに基づいてリポジトリからヘルプデスク部門のモデルを取得しなければならないということです。そのモデルから、ヘルプデスク部門ごとに異なるメンバー、カテゴリなどのリストを取得できます。これは明らかにDRYに違反します。

私の質問は、URLに指定された特定のヘルプデスク部門が派生したすべてのコントローラで使用できるように、これを行うベースコントローラを作成するにはどうすればよいのですか?

+0

あなたは含めることができますこれがどのように使用されているかについてのいくつかの図やコード例 – Statement

答えて

2

私のプロジェクトでも同様のシナリオがあります。別の継承階層を使用するのではなく、ModelBinderを使用する傾向があります。あなたはRouteDataからのエンティティ/ entitesをフェッチするModelBinder属性を行うことができます。

public class HelpdeskDepartmentBinder : CustomModelBinderAttribute, IModelBinder { 

    public override IModelBinder GetBinder() { 
     return this; 
    } 

    public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState) { 
     //... extract appropriate value from RouteData and fetch corresponding entity from database. 
    } 
} 

...あなたはすべてのあなたの行動にHelpdeskDepartmentを利用できるようにそれを使用することができます:

public class MyController : Controller { 
    public ActionResult Index([HelpdeskDepartmentBinder] HelpdeskDepartment department) { 
     return View(); 
    } 
} 
0

免責事項:私は現在、MVCプレビュー5を実行していますので、一部は新しいかもしれません。

ベストプラクティスの方法:モデルのルックアップを行うメソッドを提供する静的ユーティリティクラスを実装するだけで、アクションからのルートデータをパラメータとして取得できます。次に、モデルを必要とするすべてのアクションからこのメソッドを呼び出します。

kludgyの方法は、すべての単一のコントローラのすべての単一のアクションがモデルを必要としている場合に限り、実際にはアクションで余分なメソッド呼び出しをしたくない場合:コントローラ実装のベースクラスExecuteCore()を呼び出し、RouteDataを使用してモデルにデータを入力し、base.ExecuteCore()を呼び出します。

0

あなたは、通常のC#の継承を介してベースコントローラクラスを作成することができます。

public abstract class BaseController : Controller 
{ 
} 

public class DerivedController : BaseController 
{ 
} 

あなたが唯一の部門が必要なコントローラに対して、この基本クラスを使用することができます。派生したコントローラをインスタンス化するために特別な操作を行う必要はありません。

技術的には、これは問題なく動作します。しかし、設計の観点からはリスクがあります。あなたが言うように、あなたのすべてのコントローラが部門を必要とするなら、これは問題ありません。それらのうちのいくつかだけが部署を必要とする場合、それはまだ大丈夫かもしれません。しかし、いくつかのコントローラーが部門を必要とし、他のコントローラーが他の継承された振る舞いを必要とし、両方のサブセットが交差する場合、多重継承の問題が発生する可能性があります。これは、あなたの記載された問題を解決するための継承が最良の設計ではないことを示唆しています。

関連する問題