ASP.NET MVC中将控制器分离到类库的实现

2015 年 7 月 15 日3610

前言

在、ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是肯定的,下面我们探讨一下Controller如何分离出去。

这里我提供两种分离的方法,一是重写方法继承自IControllerFactory接口,实现里面的方法,二是MVC提供了直接在路由注册里面去控制控制器的书写,下面就这两种类型简单贴一下代码。

第一种方法

代码如下:当写完代码之后再路由中注册。提示:实现完成之后必须在路由规则方法(RegisterRoutes)里面进行注册,注册代码如下:

  ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers为控制器的类库





// 源文件头信息:



// <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></param>



public ControllersFactory(string assemblyName)



{



_assemblyName = assemblyName;



}







/// <summary>



/// 构造函数实例化



/// </summary>



/// <param></param>



/// <param></param>



public ControllersFactory(string assemblyName, string controlerDefaultNameSpage)



{



_assemblyName = assemblyName;



_controlerDefaultNameSpage = controlerDefaultNameSpage;



}







/// <summary>



/// 获取控制器类的全名



/// </summary>



/// <param>控制器名称</param>



public string GetControllerFullName(string controllerName)



{



return string.Format("{0}.{1}Controller",



string.IsNullOrEmpty(ControlerDefaultNameSpage) ? AssemblyName : ControlerDefaultNameSpage,



controllerName);



}







/// <summary>



/// 获取控制器实例对象,根据controllerName生成一个没有请求上下文对象的空的控制器,在为此控制器制定ControllerContext对象,然后返回控制器实例



/// </summary>



/// <param></param>



/// <param></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>



/// 返回请求的会话状态的支持类型



/// </summary>



/// <param></param>



/// <param></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></param>



public void ReleaseController(IController controller)



{



var idDisposable = controller as IDisposable;



if (idDisposable != null)



{



idDisposable.Dispose();



}



}



}



}



第二种方法

路由注册方法代码如下:缺点是,如果有多个注册路由的规则,都必须记得添加namespaces属性,否则会出现错误





//系统默认路由



routes.MapRoute(



name: "Default",



url: "{controller}/{action}/{id}",



defaults: new {controller = "Login", action = "Index", id = UrlParameter.Optional},



namespaces: new string[] {"BookSystem_Controllers"}



);







如果您喜欢本文请分享给您的好友,谢谢!

0 0