前言
在、ASP.NET MVC的開發(fā)中,我們創(chuàng)建完項(xiàng)目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在創(chuàng)建項(xiàng)目自動(dòng)生成的內(nèi)容上Model我們很容易分離成類庫,所以這里不予說明,那么這時(shí)候我們就像Controller是不是也能夠分離出去呢?答案是肯定的,下面我們探討一下Controller如何分離出去。
這里我提供兩種分離的方法,一是重寫方法繼承自IControllerFactory接口,實(shí)現(xiàn)里面的方法,二是MVC提供了直接在路由注冊(cè)里面去控制控制器的書寫,下面就這兩種類型簡(jiǎn)單貼一下代碼。
第一種方法
代碼如下:當(dāng)寫完代碼之后再路由中注冊(cè)。提示:實(shí)現(xiàn)完成之后必須在路由規(guī)則方法(RegisterRoutes)里面進(jìn)行注冊(cè),注冊(cè)代碼如下:
ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers為控制器的類庫
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 // 源文件頭信息: // <copyright file="ControllersFactory.cs"> // Copyright(c)2014-2034 Kencery.All rights reserved. // 創(chuàng)建人:韓迎龍(kencery) // 創(chuàng)建時(shí)間:2015-6-18 // </copyright> using System; using System.Reflection; using System.Web.Mvc; using System.Web.Routing; using System.Web.SessionState; namespace BookSystem_Controllers { /// <summary> /// 重寫注冊(cè)控制器的方法,使之能夠?qū)⒖刂破鞴芊蛛x到其它類庫中實(shí)現(xiàn) /// <auther> /// <name>kencery</name> /// <date>2015-6-18</date> /// </auther> /// </summary> /// 說明:IControllerFactory接口含有三個(gè)需要實(shí)現(xiàn)的方法:CreateController,GetControllerSessionBehavior,ReleaseController /// 使用:在MVC App_Start文件夾中的RouteConfig中的方法RegisterRoutes中的第一行中寫入下面注冊(cè)語句,Global.asax中也可注冊(cè),放到注冊(cè)路由之前即可 /// ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers為控制器的類庫 public class ControllersFactory : IControllerFactory { private readonly string _assemblyName; private readonly string _controlerDefaultNameSpage; private Assembly _controllerAssembly; /// <summary> /// 獲取控制器所在的程序集名稱 /// </summary> public string AssemblyName { get { return _assemblyName; } } /// <summary> /// 獲取控制器的默認(rèn)命名空間 /// </summary> public string ControlerDefaultNameSpage { get { return _controlerDefaultNameSpage; } } /// <summary> /// 獲取控制器所在的程序集的Assembly實(shí)例 /// </summary> public Assembly ControllerAssembly { get { return _controllerAssembly ?? (_controllerAssembly = Assembly.Load(AssemblyName)); //加載控制器信息 } } /// <summary> /// 構(gòu)造函數(shù)實(shí)例化 /// </summary> /// <param name="assemblyName"></param> public ControllersFactory(string assemblyName) { _assemblyName = assemblyName; } /// <summary> /// 構(gòu)造函數(shù)實(shí)例化 /// </summary> /// <param name="assemblyName"></param> /// <param name="controlerDefaultNameSpage"></param> public ControllersFactory(string assemblyName, string controlerDefaultNameSpage) { _assemblyName = assemblyName; _controlerDefaultNameSpage = controlerDefaultNameSpage; } /// <summary> /// 獲取控制器類的全名 /// </summary> /// <param name="controllerName">控制器名稱</param> public string GetControllerFullName(string controllerName) { return string.Format("{0}.{1}Controller", string.IsNullOrEmpty(ControlerDefaultNameSpage) ? AssemblyName : ControlerDefaultNameSpage, controllerName); } /// <summary> /// 獲取控制器實(shí)例對(duì)象,根據(jù)controllerName生成一個(gè)沒有請(qǐng)求上下文對(duì)象的空的控制器,在為此控制器制定ControllerContext對(duì)象,然后返回控制器實(shí)例 /// </summary> /// <param name="requestContext"></param> /// <param name="controllerName"></param> public IController CreateController(RequestContext requestContext, string controllerName) { var controller = ControllerAssembly.CreateInstance(GetControllerFullName(controllerName)) as Controller; if (controller == null) return null; if (controller.ControllerContext == null) { co新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注