国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

ASP.NET MVC中將控制器分離到類庫(kù)的實(shí)現(xiàn)

2024-07-10 13:29:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了ASP.NET MVC中將控制器分離到類庫(kù)的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

前言

在、ASP.NET MVC的開發(fā)中,我們創(chuàng)建完項(xiàng)目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在創(chuàng)建項(xiàng)目自動(dòng)生成的內(nèi)容上Model我們很容易分離成類庫(kù),所以這里不予說(shuō)明,那么這時(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為控制器的類庫(kù)

 

 
  1. // 源文件頭信息: 
  2. // <copyright file="ControllersFactory.cs"> 
  3. // Copyright(c)2014-2034 Kencery.All rights reserved. 
  4. // 創(chuàng)建人:韓迎龍(kencery) 
  5. // 創(chuàng)建時(shí)間:2015-6-18 
  6. // </copyright> 
  7.  
  8. using System; 
  9. using System.Reflection; 
  10. using System.Web.Mvc; 
  11. using System.Web.Routing; 
  12. using System.Web.SessionState; 
  13.  
  14. namespace BookSystem_Controllers 
  15. /// <summary> 
  16. /// 重寫注冊(cè)控制器的方法,使之能夠?qū)⒖刂破鞴芊蛛x到其它類庫(kù)中實(shí)現(xiàn) 
  17. /// <auther> 
  18. /// <name>kencery</name> 
  19. /// <date>2015-6-18</date> 
  20. /// </auther> 
  21. /// </summary> 
  22. /// 說(shuō)明:IControllerFactory接口含有三個(gè)需要實(shí)現(xiàn)的方法:CreateController,GetControllerSessionBehavior,ReleaseController 
  23. /// 使用:在MVC App_Start文件夾中的RouteConfig中的方法RegisterRoutes中的第一行中寫入下面注冊(cè)語(yǔ)句,Global.asax中也可注冊(cè),放到注冊(cè)路由之前即可 
  24. /// ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers為控制器的類庫(kù) 
  25. public class ControllersFactory : IControllerFactory 
  26. private readonly string _assemblyName; 
  27. private readonly string _controlerDefaultNameSpage; 
  28. private Assembly _controllerAssembly; 
  29.  
  30. /// <summary> 
  31. /// 獲取控制器所在的程序集名稱 
  32. /// </summary> 
  33. public string AssemblyName 
  34. get { return _assemblyName; } 
  35.  
  36. /// <summary> 
  37. /// 獲取控制器的默認(rèn)命名空間 
  38. /// </summary> 
  39. public string ControlerDefaultNameSpage 
  40. get { return _controlerDefaultNameSpage; } 
  41.  
  42. /// <summary> 
  43. /// 獲取控制器所在的程序集的Assembly實(shí)例 
  44. /// </summary> 
  45. public Assembly ControllerAssembly 
  46. get 
  47. return _controllerAssembly ?? (_controllerAssembly = Assembly.Load(AssemblyName)); //加載控制器信息 
  48.  
  49. /// <summary> 
  50. /// 構(gòu)造函數(shù)實(shí)例化 
  51. /// </summary> 
  52. /// <param name="assemblyName"></param> 
  53. public ControllersFactory(string assemblyName) 
  54. _assemblyName = assemblyName; 
  55.  
  56. /// <summary> 
  57. /// 構(gòu)造函數(shù)實(shí)例化 
  58. /// </summary> 
  59. /// <param name="assemblyName"></param> 
  60. /// <param name="controlerDefaultNameSpage"></param> 
  61. public ControllersFactory(string assemblyName, string controlerDefaultNameSpage) 
  62. _assemblyName = assemblyName; 
  63. _controlerDefaultNameSpage = controlerDefaultNameSpage; 
  64.  
  65. /// <summary> 
  66. /// 獲取控制器類的全名 
  67. /// </summary> 
  68. /// <param name="controllerName">控制器名稱</param> 
  69. public string GetControllerFullName(string controllerName) 
  70. return string.Format("{0}.{1}Controller"
  71. string.IsNullOrEmpty(ControlerDefaultNameSpage) ? AssemblyName : ControlerDefaultNameSpage, 
  72. controllerName); 
  73.  
  74. /// <summary> 
  75. /// 獲取控制器實(shí)例對(duì)象,根據(jù)controllerName生成一個(gè)沒有請(qǐng)求上下文對(duì)象的空的控制器,在為此控制器制定ControllerContext對(duì)象,然后返回控制器實(shí)例 
  76. /// </summary> 
  77. /// <param name="requestContext"></param> 
  78. /// <param name="controllerName"></param> 
  79. public IController CreateController(RequestContext requestContext, string controllerName) 
  80. var controller = ControllerAssembly.CreateInstance(GetControllerFullName(controllerName)) as Controller; 
  81. if (controller == null
  82. return null
  83. if (controller.ControllerContext == null
  84. controller.ControllerContext = new ControllerContext(requestContext, controller); 
  85. else 
  86. controller.ControllerContext.RequestContext = requestContext; 
  87. return controller; 
  88.  
  89. /// <summary> 
  90. /// 返回請(qǐng)求的會(huì)話狀態(tài)的支持類型 
  91. /// </summary> 
  92. /// <param name="requestContext"></param> 
  93. /// <param name="controllerName"></param> 
  94. public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName) 
  95. var controllerType = ControllerAssembly.GetType(GetControllerFullName(controllerName), truetrue); 
  96. var sessionStateAttr = 
  97. Attribute.GetCustomAttribute(controllerType, typeof (SessionStateAttribute), false) as 
  98. SessionStateAttribute; 
  99. return sessionStateAttr == null ? SessionStateBehavior.Default : sessionStateAttr.Behavior; 
  100.  
  101. /// <summary> 
  102. /// 釋放資源 
  103. /// </summary> 
  104. /// <param name="controller"></param> 
  105. public void ReleaseController(IController controller) 
  106. var idDisposable = controller as IDisposable; 
  107. if (idDisposable != null
  108. idDisposable.Dispose(); 

第二種方法

路由注冊(cè)方法代碼如下:缺點(diǎn)是,如果有多個(gè)注冊(cè)路由的規(guī)則,都必須記得添加namespaces屬性,否則會(huì)出現(xiàn)錯(cuò)誤

 

 
  1. //系統(tǒng)默認(rèn)路由 
  2. routes.MapRoute( 
  3. name: "Default"
  4. url: "{controller}/{action}/{id}"
  5. defaults: new {controller = "Login", action = "Index", id = UrlParameter.Optional}, 
  6. namespaces: new string[] {"BookSystem_Controllers"
  7. ); 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 睢宁县| 集贤县| 正镶白旗| 陇西县| 梅河口市| 嘉兴市| 遵化市| 琼结县| 灵丘县| 克山县| 柞水县| 南平市| 平江县| 公安县| 莱西市| 禹州市| 温州市| 浑源县| 浦城县| 广州市| 磐石市| 昭平县| 中卫市| 广丰县| 盐边县| 荃湾区| 南汇区| 登封市| 全州县| 清新县| 云浮市| 安溪县| 崇明县| 广安市| 腾冲县| 响水县| 昂仁县| 海淀区| 开封县| 浦城县| 广宗县|