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
{
}

我已经定义了两个控制器,其中,我只为一个控制器定义了这个属性,而没有为另一个控制器定义这个属性。请看下面的代码。

基本控制器

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

我会选择一个稍微不同的方向。

我将拥有 2 个基类,而不是 if 语句:BaseForSetup1Controller、BaseForSetup2Contoller。

所以,

public class UsingSetup1Controller : BaseForSetup1Controller {}

public class UsingSetup2Controller : BaseForSetup2Controller {}

更进一步:我更喜欢使用过滤器而不是基类初始化。因此,您可以创建几个初始化过滤器(使用 OnActionExecuting 方法的操作过滤器)并根据需要将它们应用到控制器上。

[Setup1Initialization]
public class UsingSetup1Controller { }

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