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

前言

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

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

第一种方法

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

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

  1 // 源文件头信息:
  2 // <copyright file="ControllersFactory.cs">
  3 // Copyright(c)2014-2034 Kencery.All rights reserved.
  4 // 个人博客:http://www.cnblogs.com/hanyinglong
  5 // 创建人:韩迎龙(kencery)
  6 // 创建时间:2015-6-18
  7 // </copyright>
  8
  9 using System;
 10 using System.Reflection;
 11 using System.Web.Mvc;
 12 using System.Web.Routing;
 13 using System.Web.SessionState;
 14
 15 namespace BookSystem_Controllers
 16 {
 17     /// <summary>
 18     /// 重写注册控制器的方法,使之能够将控制器管分离到其它类库中实现
 19     /// <auther>
 20     ///     <name>kencery</name>
 21     ///     <date>2015-6-18</date>
 22     /// </auther>
 23     /// </summary>
 24     /// 说明:IControllerFactory接口含有三个需要实现的方法:CreateController,GetControllerSessionBehavior,ReleaseController
 25     /// 使用:在MVC App_Start文件夹中的RouteConfig中的方法RegisterRoutes中的第一行中写入下面注册语句,Global.asax中也可注册,放到注册路由之前即可
 26     /// ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers"));  //BookSystem_Controllers为控制器的类库
 27     public class ControllersFactory : IControllerFactory
 28     {
 29         private readonly string _assemblyName;
 30         private readonly string _controlerDefaultNameSpage;
 31         private Assembly _controllerAssembly;
 32
 33         /// <summary>
 34         /// 获取控制器所在的程序集名称
 35         /// </summary>
 36         public string AssemblyName
 37         {
 38             get { return _assemblyName; }
 39         }
 40
 41         /// <summary>
 42         /// 获取控制器的默认命名空间
 43         /// </summary>
 44         public string ControlerDefaultNameSpage
 45         {
 46             get { return _controlerDefaultNameSpage; }
 47         }
 48
 49         /// <summary>
 50         /// 获取控制器所在的程序集的Assembly实例
 51         /// </summary>
 52         public Assembly ControllerAssembly
 53         {
 54             get
 55             {
 56                 return _controllerAssembly ?? (_controllerAssembly = Assembly.Load(AssemblyName)); //加载控制器信息
 57             }
 58         }
 59
 60         /// <summary>
 61         /// 构造函数实例化
 62         /// </summary>
 63         /// <param name="assemblyName"></param>
 64         public ControllersFactory(string assemblyName)
 65         {
 66             _assemblyName = assemblyName;
 67         }
 68
 69         /// <summary>
 70         /// 构造函数实例化
 71         /// </summary>
 72         /// <param name="assemblyName"></param>
 73         /// <param name="controlerDefaultNameSpage"></param>
 74         public ControllersFactory(string assemblyName, string controlerDefaultNameSpage)
 75         {
 76             _assemblyName = assemblyName;
 77             _controlerDefaultNameSpage = controlerDefaultNameSpage;
 78         }
 79
 80         /// <summary>
 81         /// 获取控制器类的全名
 82         /// </summary>
 83         /// <param name="controllerName">控制器名称</param>
 84         public string GetControllerFullName(string controllerName)
 85         {
 86             return string.Format("{0}.{1}Controller",
 87                 string.IsNullOrEmpty(ControlerDefaultNameSpage) ? AssemblyName : ControlerDefaultNameSpage,
 88                 controllerName);
 89         }
 90
 91         /// <summary>
 92         /// 获取控制器实例对象,根据controllerName生成一个没有请求上下文对象的空的控制器,在为此控制器制定ControllerContext对象,然后返回控制器实例
 93         /// </summary>
 94         /// <param name="requestContext"></param>
 95         /// <param name="controllerName"></param>
 96         public IController CreateController(RequestContext requestContext, string controllerName)
 97         {
 98             var controller = ControllerAssembly.CreateInstance(GetControllerFullName(controllerName)) as Controller;
 99             if (controller == null)
100                 return null;
101             if (controller.ControllerContext == null)
102             {
103                 controller.ControllerContext = new ControllerContext(requestContext, controller);
104             }
105             else
106             {
107                 controller.ControllerContext.RequestContext = requestContext;
108             }
109             return controller;
110         }
111
112         /// <summary>
113         /// 返回请求的会话状态的支持类型
114         /// </summary>
115         /// <param name="requestContext"></param>
116         /// <param name="controllerName"></param>
117         public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
118         {
119             var controllerType = ControllerAssembly.GetType(GetControllerFullName(controllerName), true, true);
120             var sessionStateAttr =
121                 Attribute.GetCustomAttribute(controllerType, typeof (SessionStateAttribute), false) as
122                     SessionStateAttribute;
123             return sessionStateAttr == null ? SessionStateBehavior.Default : sessionStateAttr.Behavior;
124         }
125
126         /// <summary>
127         /// 释放资源
128         /// </summary>
129         /// <param name="controller"></param>
130         public void ReleaseController(IController controller)
131         {
132             var idDisposable = controller as IDisposable;
133             if (idDisposable != null)
134             {
135                 idDisposable.Dispose();
136             }
137         }
138     }
139 }

第二种方法

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

1      //系统默认路由
2             routes.MapRoute(
3                 name: "Default",
4                 url: "{controller}/{action}/{id}",
5                 defaults: new {controller = "Login", action = "Index", id = UrlParameter.Optional},
6                 namespaces: new string[] {"BookSystem_Controllers"}
7     );
时间: 2024-07-29 00:04:07

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

ASP.NET MVC 5 - 控制器

原文:ASP.NET MVC 5 - 控制器 MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉您如何在ASP.NET MVC 5中使用它

asp.net MVC中控制器获取表单form提交的数据之实体类数据

第一次写记录文章,难免有不足之处:欢迎指出. 1.新建一个mvc项目如: 2.新建一个Test.cs 注意get,set方法不能简写 ? 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 using System; using System.Collections.Generic; using System.Linq; usi

ASP.NET MVC在控制器中分别用Get和post模式调用天气url返回数据乱码

ASP.NET MVC在控制器分别中用Get和POST模式调用天气url返回数据乱码 !!!已解决,分享分享!!! 感谢大神:Daniel Cai 感谢大神:顾晓北 post方法,本人不知道,如果有大神知道,请指导!! //用UTF-8转码有汉字参数的url protected string UrlUtf_8(string url) { byte[] bs = Encoding.GetEncoding("UTF-8").GetBytes(url); StringBuilder sb =

[转]ASP.NET MVC 5 - 控制器

MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉您如何在ASP.NET MVC 5中使用它们来构建应用程序. 首先,让我们创建一个控制器

【转】.NET MVC控制器分离到类库的方法

在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是肯定的,下面我们探讨一下Controller如何分离出去. 这里我提供两种分离的方法,一是重写方法继承自IControllerFactory接口,实现里面的方法,二是MVC提供了直接在路由注册里面去控制控制器的书写,下

.NET MVC控制器分离到类库的方法

在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是肯定的,下面我们探讨一下Controller如何分离出去. 这里我提供两种分离的方法,一是重写方法继承自IControllerFactory接口,实现里面的方法,二是MVC提供了直接在路由注册里面去控制控制器的书写,下

ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)

转自:http://www.cnblogs.com/zyqgold/archive/2010/11/22/1884779.html 在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送表单实现的.具体使用中,主要使用以下三种方法. 1.通过Request.Form读取表单数据        2.通过FormCollection读取表单数据        3.直接读取表单数据对象 下边是我学习这些东西时的一点总结 1.通过Request.Form读取表单数据      首先定

NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controller的继承体系) 4.ASP.NETMVC IController Factory 控制器工厂(Controller的创建) 1]开篇介绍 经过前一篇文章.NET/ASP.NET Routing路由(深入解析路由系统架构原理) 的讲解,我们对ASP.NETRouting路由系统的整个运行机制有了一个

ASP.NET MVC 04 - 控制器

PS: 唉.本来这一篇前几天早就应该发了的,可是谁每月没有那么几天啊... 呵呵.开个玩笑.反正就是各种烦气,所以也就一直没上来继续发了. 年底了,摆正一下心态吧.好好干,整点钱,过年回家能跟亲朋好友好好装装逼啊是不.哈哈. 本篇目录: 1. 控制器的角色 1.1 控制器简史 2. 控制器基础 2.1 简单示例:HomeController 2.2 创建第一个控制器 2.2.1 创建新控制器 2.2.2 编写操作方法 2.2.3 经验总结 3. 小结 ▁▃▅ 控制器 ▅▃▁ 本篇将阐述ASP.N