• kooboo cms可替换Controller扩展性


    为进一步增加kooboo cms的可扩展性,要实现现有controller的可替换机制,群里看到阿不说“写一个ControllerFactory就可以解决”的字样。

      一开始没有理解其中的原由,也完全不清楚该怎么实现这一扩展,简单思考后猜想mvc应该是通过工厂方法来取得controller的实例,然后可以实现一个自己的Factory来替换即可。遂打开mvc3源码看个究竟,果然找到了IControllerFactory这个借口,也看到DefaultControllerFactory,这印证了我的猜想,happy!(汗!js写多了c#变得陌生)。

    以下是具体的扩展思路:


    1.继承IControllerFactory,实现其接口方法,或是继承DefaultControllerFactory,根据需要进行适当的重写。

    推介只用后者,简单方便,提供一个存储自定义Controller类型的容器,并提供一个注册类型的API。

    public class TestControllerFactory : DefaultControllerFactory
    {
        static Dictionary<string, Type> CustomizeControllers;
    
        static TestControllerFactory()
        {
            CustomizeControllers = new Dictionary<string, Type>();
        }
    
        public static void RegisterCustomizeController(Type t)
        {
            CustomizeControllers[t.Name] = t;
        }
    
        protected internal override Type GetControllerType(RequestContext requestContext, string controllerName)
        {
            if (CustomizeControllers.ContainsKey(controllerName))
            {
                return CustomizeControllers[controllerName];
            }
            else
            {
                return base.GetControllerType(requestContext, controllerName);
            }
        }
    }
    

    2.在扩展的dll里面利用PreApplicationStartMethod实现注册,这样的好处是零配置,只要将dll拷贝到bin目录即可。

    [assembly: System.Web.PreApplicationStartMethod(typeof(Test.AssemblyInitializer), "Initialize")]
    
    namespace Test
    {
        public static class AssemblyInitializer
        {
            public static void Initialize()
            {
                TestControllerFactory.RegisterCustomizeController(typeof(TestExtentController));
            }
        }
    
        public class TestExtentController : Controller
        {
        }
    }
    

     3.万事具备了。。。等等!这时候MVC还不知道TestControllerFactory的存在呀,没错,我们还需要在Global中注册TestControllerFactory实例给MVC,替换掉默认的DefaultControllerFactory。

    protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new TestControllerFactory());
    
        // others
        RegisterRoutes(RouteTable.Routes);
    }
    

    思路完毕,代码没有经过验证也没有运行起来过,纯思路而已。

    浏览器没那么聪明!
  • 相关阅读:
    2019-9-2-一个好的程序员
    2019-9-2-一个好的程序员
    2018-2-13-wpf-GifBitmapDecoder-解析-gif-格式
    2018-2-13-wpf-GifBitmapDecoder-解析-gif-格式
    2019-5-31-SharpDx-进入全屏模式
    2019-5-31-SharpDx-进入全屏模式
    2019-8-31-dotnet-删除只读文件
    2019-8-31-dotnet-删除只读文件
    PHP mysqli_real_connect() 函数
    PHP mysqli_query() 函数
  • 原文地址:https://www.cnblogs.com/rulee/p/2452100.html
Copyright © 2020-2023  润新知