1

BaseControllerすべてのコントローラーが継承するクラスがあります。ExecuteCoreこれには、 (ほぼ)すべてのコントローラーとそのアクションに必要な初期設定を行うオーバーライドされたメソッドがあります。

    protected override void ExecuteCore()
    {
        SetUpMethod1();
        SetUpMethod2();
        base.ExecuteCore();
    }

    protected virtual void SetUpMethod1()
    {
       //some initialization stuff
    }

    protected virtual void SetUpMethod2()
    {
       //some other initialization stuff
    }

一部のコントローラーが異なる動作を必要とする場合、コントローラーの関連するメソッドをオーバーライドするのは簡単であり、それはうまく機能します。ただし、セットアップメソッドで多少異なる動作を必要とするさまざまなコントローラーからのアクションがいくつかあります。

私は思いついた

    protected virtual void SetUpMethod1()
    {
        string controller = (string)ControllerContext.RouteData.Values["controller"]);
        string action = (string)ControllerContext.RouteData.Values["action"]);
        if (controller/account combination is in a list)
            //special setup
        else
            //regular setup
    }

何か悪いことをしているという気持ちを揺さぶることはできません。この動作を取得するためのより良い/正しい方法はありますか?

4

2 に答える 2

1

新しい属性を追加

public sealed class SpecialSetUpAttribute : Attribute
{
}

2 つのコントローラーを定義しましたが、この属性は 1 つのコントローラーのみに定義し、他のコントローラーには定義しませんでした。以下のコードを参照してください。

基本コントローラー

public class BasicController : BaseController
    {
        //
        // GET: /Basic/

        public ActionResult Index()
        {
            return View();
        }

}

専用セットアップコントローラー

[SpecialSetUp]
public class HomeController : BaseController
{

}

BaseController から派生した両方のコントローラー。BaseController のコードを参照してください。

 public class BaseController : Controller
        {
            protected override void ExecuteCore()
            {
                Type controllerType = this.ControllerContext.Controller.GetType();
                ControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(controllerType);

// Edit start
                string actionName = Convert.ToString(this.ControllerContext.RouteData.Values["action"]);
            string controller = Convert.ToString(this.ControllerContext.RouteData.Values["controller"]);

// Edit end

                if (controllerDescriptor.IsDefined(typeof(SpecialSetUpAttribute), true))
                {
                    //Do special setup
                }
                else
                {
                    //Do normal setup
                }
                base.ExecuteCore();
            }
        }

BasicController のアプリケーションを実行すると、通常のセットアップ コードが実行されます。HomeController のアプリケーションを実行すると、特別なセットアップ コードが実行されます。このコードをコントローラ レベルで実装しました。アクションレベルでも同じことができます。

于 2012-07-04T11:56:27.493 に答える
0

私は少し違う方向に行きます。

if ステートメントを使用する代わりに、BaseForSetup1Controller、BaseForSetup2Contoller の 2 つの基本クラスを使用します。

そう、

public class UsingSetup1Controller : BaseForSetup1Controller {}

public class UsingSetup2Controller : BaseForSetup2Controller {}

もう少し: 基本クラスの初期化の代わりにフィルターを使用することを好みます。したがって、いくつかの初期化フィルター (OnActionExecuting メソッドを使用するアクション フィルター) を作成し、必要に応じてそれらをコントローラーに適用することができます。

[Setup1Initialization]
public class UsingSetup1Controller { }

[Setup2Initialization]
public class UsingSetup2Controller { }
于 2012-07-04T08:41:30.433 に答える