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为控制器的类库
// 源文件头信息:
// <copyright file="ControllersFactory.cs">
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 个人博客:http://www.cnblogs.com/hanyinglong
// 创建人:韩迎龙(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"}
);
第三种方法
第三种方法是我这段时间建立MVC项目使用的方法,不像上面那么复杂,只要namespace命名等规范,其实在MVC项目下的Controller就是DLL文件,所以当我们将控制器分离成类库移除去的时候,直接在MVC项目中添加DLL文件即可实现分离
ASP.NET MVC中将控制器分离到类库的实现的更多相关文章
- ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- ASP.NET MVC中将数据从Controller传递到视图
ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...
- 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...
- [转]ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- .NET MVC控制器分离到类库的方法
在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...
- 【转】.NET MVC控制器分离到类库的方法
在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...
- ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)
http://www.cnblogs.com/zyqgold/archive/2010/11/22/1884779.html 在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送 ...
随机推荐
- [LeetCode] Range Sum Query 2D - Immutable
Very similar to Range Sum Query - Immutable, but we now need to compute a 2d accunulated-sum. In fac ...
- java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类
提起java内裤类(innerClass)很多人不太熟悉,实际上类似的概念在c++里面也有,那就是嵌套类(Nested Class),关于这俩者的区别,在下文中会有对比.内部类从表面上看,就是在类中定 ...
- Qt编写自定义控件大全
最新版可执行文件 http://pan.baidu.com/s/1i491FQP 不定期增加控件及修正BUG和改进算法. 总图: 1:动画按钮 * 1:可设置显示的图像和底部的文字 * 2:可设置普通 ...
- 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByTagName
按照标签名获取元素 -- getElementsByTagName 标准 DOM 1在Element和Document两个interface中均有定义,原型NodeList getElementsBy ...
- 解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题
转自cocoachina iOS 7能在后台自动app,这对开发者来说和用户都很方便,但是还是有一些缺点.用户不会知道app本次更新的内容,除非他们上到app的App Store页面去查看.开发者也会 ...
- CSS的sprite和单位
(1).关于css sprite技术 比方说: 有个论坛频道,其中有个一些论坛特有的小图标(火啊,顶啊之类),基于整站小图标大团结的思想,这些小图标也放在了那个icon背景图片上了.然而,数年下来,我 ...
- toad 常用快捷键与配置
F8 调出以前执行的sql命令 F9 执行全部sql Ctrl+. 补全table_name Ctrl+t 补全table_name,或者显示字段 alt+ 箭头上下 看sql history Ctr ...
- 挑选分组中top1
select * from( select *, ROW_NUMBER() over(partition by accountid order by opentime DESC) as rowNumf ...
- SNF开发平台WinForm之十-Excel导入-SNF快速开发平台3.3-Spring.Net.Framework
7.1运行效果: 2.Excel导入开发实现 2.1. 创建窗体,修改命名空间 新增的窗体命名“FrmImport表名”,这个导入窗口比较其它窗口会特殊一些,需要继承BaseFormImport父级窗 ...
- java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字
前段时间因为工作需要,要实现将一段文字或者url生成二维码,然后中间附上logo,下方正中间附上文字的功能. 上网找了几篇教程学习了下,由于没有保存借鉴的博文链接,所以就没po上参考文章的链接啦,感谢 ...