最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-27 22:38:23
文档

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

ASP.NET MVC中将控制器分离到类库的实现:前言 在、ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是
推荐度:
导读ASP.NET MVC中将控制器分离到类库的实现:前言 在、ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是

前言

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

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

ASP.NET MVC中将控制器分离到类库的实现:前言 在、ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是
推荐度:
标签: 分离 mvc ASP.NET
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top