Mvc如何重写控制器工厂!

直接上代码,主要看红色文字,在这里根据自己项目需求获取到控制器的type。

    public class CustomControllerFactory : DefaultControllerFactory
    {
        /// <summary>
        /// 根据控制器名称及请求信息获得控制器类型。
        /// </summary>
        /// <param name="requestContext">请求信息</param>
        /// <param name="controllerName">控制器名称。</param>
        /// <returns>控制器类型。</returns>
        protected override Type GetControllerType(RequestContext requestContext, string controllerName)
        {
            Type controllerType = null;
            //路由中包含pluginName才重写, 反射动态加载的控制器必须重写控制器工厂。
            if (requestContext.RouteData.Values.ContainsKey("pluginName"))
            {
                string pluginName = requestContext.RouteData.Values["pluginName"].ToString();
                controllerType = this.GetControllerType(pluginName, controllerName);
            }
            else
            {
                controllerType = base.GetControllerType(requestContext, controllerName);
                if (controllerType != null)
                {
                    if (requestContext.RouteData.DataTokens.ContainsKey("Namespaces"))
                    {
                        string[] nameSpaces = (string[])requestContext.RouteData.DataTokens["Namespaces"];
                        //把默认优先级改为直接限制
                        if (!nameSpaces.Contains(controllerType.Namespace))
                        {
                            return null;
                        }
                    }
                }
            }
            return controllerType;
        }
.....

重写必须继承DefaultControllerFactory,然后在启动时候注册,注册方式,可以在global文件的Application_Start()中注册,代码如下:

ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory()); //重新注册控制器工厂

也可以通过特性自启动,代码如下:

[assembly: System.Web.PreApplicationStartMethod(typeof(PageAdmin.Plugin.Bootstrapper), "Initialize")]
namespace PageAdmin.Plugin
{
    /// <summary>
    /// 引导程序。
    /// </summary>
    public static class Bootstrapper
    {
        /// <summary>
        /// 初始化。
        /// </summary>
        public static void Initialize()
        {
            //注册插件控制器工厂。
            ControllerBuilder.Current.SetControllerFactory(new PluginControllerFactory());
............... } } }
原文地址:https://www.cnblogs.com/huaguo/p/8202563.html