ASP.NET MVC中将控制器分离到类库的实现
ASP.NET MVC中将控制器分离到类库的实现
发布时间:2015-10-27 来源:查字典编辑
摘要:这篇文章主要介绍了MVC中将控制器分离到类库的实现的相关资料,需要的朋友可以参考下前言在、MVC的开发中,我们创建完项目之后,MVC是已Mo...
这篇文章主要介绍了 MVC中将控制器分离到类库的实现的相关资料,需要的朋友可以参考下

前言

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

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

第一种方法

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

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

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 // 源文件头信息: // 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 /// kencery/name /// 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属性,否则会出现错误

? 1 2 3 4 5 6 7 //系统默认路由 routes.MapRoute( name: Default, url: {controller}/{action}/{id}, defaults: new {controller = Login, action = Index, id = UrlParameter.Optional}, namespaces: new string[] {BookSystem_Controllers} );
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类