萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> asp.net編程 >> ASP.NET MVC中將控制器分離到類庫的實現

ASP.NET MVC中將控制器分離到類庫的實現

         這篇文章主要介紹了ASP.NET MVC中將控制器分離到類庫的實現的相關資料,需要的朋友可以參考下    

        前言

  在、ASP.NET MVC的開發中,我們創建完項目之後,ASP.NET MVC是已Model-Controller-View的形式存在的,在創建項目自動生成的內容上Model我們很容易分離成類庫,所以這裡不予說明,那麼這時候我們就像Controller是不是也能夠分離出去呢?答案是肯定的,下面我們探討一下Controller如何分離出去。

  這裡我提供兩種分離的方法,一是重寫方法繼承自IControllerFactory接口,實現裡面的方法,二是MVC提供了直接在路由注冊裡面去控制控制器的書寫,下面就這兩種類型簡單貼一下代碼。

第一種方法

  代碼如下:當寫完代碼之後再路由中注冊。提示:實現完成之後必須在路由規則方法(RegisterRoutes)裡面進行注冊,注冊代碼如下:

    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. // 創建人:韓迎龍(kencery) // 創建時間: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> /// 重寫注冊控制器的方法,使之能夠將控制器管分離到其它類庫中實現 /// <auther> /// <name>kencery</name> /// <date>2015-6-18</date> /// </auther> /// </summary> /// 說明:IControllerFactory接口含有三個需要實現的方法:CreateController,GetControllerSessionBehavior,ReleaseController /// 使用:在MVC App_Start文件夾中的RouteConfig中的方法RegisterRoutes中的第一行中寫入下面注冊語句,Global.asax中也可注冊,放到注冊路由之前即可 /// 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> /// 獲取控制器的默認命名空間 /// </summary> public string ControlerDefaultNameSpage { get { return _controlerDefaultNameSpage; } }   /// <summary> /// 獲取控制器所在的程序集的Assembly實例 /// </summary> public Assembly ControllerAssembly { get { return _controllerAssembly ?? (_controllerAssembly = Assembly.Load(AssemblyName)); //加載控制器信息 } }   /// <summary> /// 構造函數實例化 /// </summary> /// <param name="assemblyName"></param> public ControllersFactory(string assemblyName) { _assemblyName = assemblyName; }   /// <summary> /// 構造函數實例化 /// </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> /// 獲取控制器實例對象,根據controllerName生成一個沒有請求上下文對象的空的控制器,在為此控制器制定ControllerContext對象,然後返回控制器實例 /// </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);
copyright © 萬盛學電腦網 all rights reserved