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"} );