ASP.NET MVC中将控制器分离到类库的实现
前言
在、ASP.NETMVC的开发中,我们创建完项目之后,ASP.NETMVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是肯定的,下面我们探讨一下Controller如何分离出去。
这里我提供两种分离的方法,一是重写方法继承自IControllerFactory接口,实现里面的方法,二是MVC提供了直接在路由注册里面去控制控制器的书写,下面就这两种类型简单贴一下代码。
第一种方法
代码如下:当写完代码之后再路由中注册。提示:实现完成之后必须在路由规则方法(RegisterRoutes)里面进行注册,注册代码如下:
ControllerBuilder.Current.SetControllerFactory(newControllersFactory("BookSystem_Controllers"));//BookSystem_Controllers为控制器的类库
//源文件头信息:
//<copyrightfile="ControllersFactory.cs">
//Copyright(c)2014-2034Kencery.Allrightsreserved.
//创建人:韩迎龙(kencery)
//创建时间:2015-6-18
//</copyright>
usingSystem;
usingSystem.Reflection;
usingSystem.Web.Mvc;
usingSystem.Web.Routing;
usingSystem.Web.SessionState;
namespaceBookSystem_Controllers
{
///<summary>
///重写注册控制器的方法,使之能够将控制器管分离到其它类库中实现
///<auther>
///<name>kencery</name>
///<date>2015-6-18</date>
///</auther>
///</summary>
///说明:IControllerFactory接口含有三个需要实现的方法:CreateController,GetControllerSessionBehavior,ReleaseController
///使用:在MVCApp_Start文件夹中的RouteConfig中的方法RegisterRoutes中的第一行中写入下面注册语句,Global.asax中也可注册,放到注册路由之前即可
///ControllerBuilder.Current.SetControllerFactory(newControllersFactory("BookSystem_Controllers"));//BookSystem_Controllers为控制器的类库
publicclassControllersFactory:IControllerFactory
{
privatereadonlystring_assemblyName;
privatereadonlystring_controlerDefaultNameSpage;
privateAssembly_controllerAssembly;
///<summary>
///获取控制器所在的程序集名称
///</summary>
publicstringAssemblyName
{
get{return_assemblyName;}
}
///<summary>
///获取控制器的默认命名空间
///</summary>
publicstringControlerDefaultNameSpage
{
get{return_controlerDefaultNameSpage;}
}
///<summary>
///获取控制器所在的程序集的Assembly实例
///</summary>
publicAssemblyControllerAssembly
{
get
{
return_controllerAssembly??(_controllerAssembly=Assembly.Load(AssemblyName));//加载控制器信息
}
}
///<summary>
///构造函数实例化
///</summary>
///<paramname="assemblyName"></param>
publicControllersFactory(stringassemblyName)
{
_assemblyName=assemblyName;
}
///<summary>
///构造函数实例化
///</summary>
///<paramname="assemblyName"></param>
///<paramname="controlerDefaultNameSpage"></param>
publicControllersFactory(stringassemblyName,stringcontrolerDefaultNameSpage)
{
_assemblyName=assemblyName;
_controlerDefaultNameSpage=controlerDefaultNameSpage;
}
///<summary>
///获取控制器类的全名
///</summary>
///<paramname="controllerName">控制器名称</param>
publicstringGetControllerFullName(stringcontrollerName)
{
returnstring.Format("{0}.{1}Controller",
string.IsNullOrEmpty(ControlerDefaultNameSpage)?AssemblyName:ControlerDefaultNameSpage,
controllerName);
}
///<summary>
///获取控制器实例对象,根据controllerName生成一个没有请求上下文对象的空的控制器,在为此控制器制定ControllerContext对象,然后返回控制器实例
///</summary>
///<paramname="requestContext"></param>
///<paramname="controllerName"></param>
publicIControllerCreateController(RequestContextrequestContext,stringcontrollerName)
{
varcontroller=ControllerAssembly.CreateInstance(GetControllerFullName(controllerName))asController;
if(controller==null)
returnnull;
if(controller.ControllerContext==null)
{
controller.ControllerContext=newControllerContext(requestContext,controller);
}
else
{
controller.ControllerContext.RequestContext=requestContext;
}
returncontroller;
}
///<summary>
///返回请求的会话状态的支持类型
///</summary>
///<paramname="requestContext"></param>
///<paramname="controllerName"></param>
publicSessionStateBehaviorGetControllerSessionBehavior(RequestContextrequestContext,stringcontrollerName)
{
varcontrollerType=ControllerAssembly.GetType(GetControllerFullName(controllerName),true,true);
varsessionStateAttr=
Attribute.GetCustomAttribute(controllerType,typeof(SessionStateAttribute),false)as
SessionStateAttribute;
returnsessionStateAttr==null?SessionStateBehavior.Default:sessionStateAttr.Behavior;
}
///<summary>
///释放资源
///</summary>
///<paramname="controller"></param>
publicvoidReleaseController(IControllercontroller)
{
varidDisposable=controllerasIDisposable;
if(idDisposable!=null)
{
idDisposable.Dispose();
}
}
}
}
第二种方法
路由注册方法代码如下:缺点是,如果有多个注册路由的规则,都必须记得添加namespaces属性,否则会出现错误
//系统默认路由
routes.MapRoute(
name:"Default",
url:"{controller}/{action}/{id}",
defaults:new{controller="Login",action="Index",id=UrlParameter.Optional},
namespaces:newstring[]{"BookSystem_Controllers"}
);