這篇文章主要介紹了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ù)
- // 源文件頭信息:
- // <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到其它類庫(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中的第一行中寫入下面注冊(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è)沒有請(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"}
- );
新聞熱點(diǎn)
疑難解答
圖片精選