0

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

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

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

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

4

3 に答える 3

2

私のプロジェクトの 1 つに同様のシナリオがあり、個別の継承階層を使用するのではなく、ModelBinder を使用する傾向があります。RouteData からエンティティをフェッチする 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();
    }
}
于 2008-09-17T13:29:51.453 に答える
0

免責事項:私は現在MVC Preview 5を実行しているので、これの一部は新しい可能性があります。

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

すべてのコントローラーのすべてのアクションがモデルを必要とし、アクションで余分なメソッド呼び出しを本当に必要としない場合にのみ、厄介な方法です。Controller-implementing-base-classで、ExecuteCore()をオーバーライドします。 RouteDataを使用してモデルにデータを入力してから、base.ExecuteCore()を呼び出します。

于 2008-09-16T00:53:00.940 に答える
0

通常のC#継承を介して基本コントローラークラスを作成できます。

public abstract class BaseController : Controller 
{
}

public class DerivedController : BaseController 
{
}

この基本クラスは、部門を必要とするコントローラーにのみ使用できます。派生コントローラーをインスタンス化するために特別なことをする必要はありません。

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

于 2008-09-16T13:42:45.427 に答える