ASP.NET MVC中实现将控制器分离到类库的方法有哪些
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET MVC中实现将控制器分离到类库的方法有哪些
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本篇文章給大家分享的是有關ASP.NET 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"}
);
總結
以上是生活随笔為你收集整理的ASP.NET MVC中实现将控制器分离到类库的方法有哪些的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建FTP服务器
- 下一篇: 王者历史战绩怎么隐藏