ASP.NET MVC中将控制器分离到类库的实现
程序员文章站
2024-02-20 15:54:16
前言
在、asp.net mvc的开发中,我们创建完项目之后,asp.net mvc是已model-controller-view的形式存在的,在创建项目自动生成的内...
前言
在、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 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); } else { controller.controllercontext.requestcontext = requestcontext; } return controller; } /// <summary> /// 返回请求的会话状态的支持类型 /// </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(); } } } }
第二种方法
路由注册方法代码如下:缺点是,如果有多个注册路由的规则,都必须记得添加namespaces属性,否则会出现错误
//系统默认路由 routes.maproute( name: "default", url: "{controller}/{action}/{id}", defaults: new {controller = "login", action = "index", id = urlparameter.optional}, namespaces: new string[] {"booksystem_controllers"} );