您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)ASP.NET MVC中實(shí)現(xiàn)將控制器分離到類庫(kù)的方法有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
第一種方法
代碼如下:當(dāng)寫(xiě)完代碼之后再路由中注冊(cè)。提示:實(shí)現(xiàn)完成之后必須在路由規(guī)則方法(RegisterRoutes)里面進(jìn)行注冊(cè),注冊(cè)代碼如下:
ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers為控制器的類庫(kù)
// 源文件頭信息: // <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> /// 重寫(xiě)注冊(cè)控制器的方法,使之能夠?qū)⒖刂破鞴芊蛛x到其它類庫(kù)中實(shí)現(xiàn) /// <auther> /// <name>kencery</name> /// <date>2015-6-18</date> /// </auther> /// </summary> /// 說(shuō)明:IControllerFactory接口含有三個(gè)需要實(shí)現(xiàn)的方法:CreateController,GetControllerSessionBehavior,ReleaseController /// 使用:在MVC App_Start文件夾中的RouteConfig中的方法RegisterRoutes中的第一行中寫(xiě)入下面注冊(cè)語(yǔ)句,Global.asax中也可注冊(cè),放到注冊(cè)路由之前即可 /// ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers為控制器的類庫(kù) 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è)沒(méi)有請(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) { controller.ControllerContext = new ControllerContext(requestContext, controller); } else { controller.ControllerContext.RequestContext = requestContext; } return controller; } /// <summary> /// 返回請(qǐng)求的會(huì)話狀態(tài)的支持類型 /// </summary> /// <param name="requestContext"></param> /// <param name="controllerName"></param> public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName) { var controllerType = ControllerAssembly.GetType(GetControllerFullName(controllerName), true, true); var sessionStateAttr = Attribute.GetCustomAttribute(controllerType, typeof (SessionStateAttribute), false) as SessionStateAttribute; return sessionStateAttr == null ? SessionStateBehavior.Default : sessionStateAttr.Behavior; } /// <summary> /// 釋放資源 /// </summary> /// <param name="controller"></param> public void ReleaseController(IController controller) { var idDisposable = controller as IDisposable; if (idDisposable != null) { idDisposable.Dispose(); } } } }
第二種方法
路由注冊(cè)方法代碼如下:缺點(diǎn)是,如果有多個(gè)注冊(cè)路由的規(guī)則,都必須記得添加namespaces屬性,否則會(huì)出現(xiàn)錯(cuò)誤
//系統(tǒng)默認(rèn)路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new {controller = "Login", action = "Index", id = UrlParameter.Optional}, namespaces: new string[] {"BookSystem_Controllers"} );
以上就是ASP.NET MVC中實(shí)現(xiàn)將控制器分離到類庫(kù)的方法有哪些,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。