主頁(yè) > 知識(shí)庫(kù) > ASP.NET MVC中將控制器分離到類庫(kù)的實(shí)現(xiàn)

ASP.NET MVC中將控制器分離到類庫(kù)的實(shí)現(xiàn)

熱門標(biāo)簽:服務(wù)器配置 集中運(yùn)營(yíng)管理辦法 百度競(jìng)價(jià)排名 地方門戶網(wǎng)站 阿里云 網(wǎng)站排名優(yōu)化 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 硅谷的囚徒呼叫中心

前言

  在、ASP.NET MVC的開發(fā)中,我們創(chuàng)建完項(xiàng)目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在創(chuàng)建項(xiàng)目自動(dòng)生成的內(nèi)容上Model我們很容易分離成類庫(kù),所以這里不予說(shuō)明,那么這時(shí)候我們就像Controller是不是也能夠分離出去呢?答案是肯定的,下面我們探討一下Controller如何分離出去。

  這里我提供兩種分離的方法,一是重寫方法繼承自IControllerFactory接口,實(shí)現(xiàn)里面的方法,二是MVC提供了直接在路由注冊(cè)里面去控制控制器的書寫,下面就這兩種類型簡(jiǎn)單貼一下代碼。

第一種方法

  代碼如下:當(dāng)寫完代碼之后再路由中注冊(cè)。提示:實(shí)現(xiàn)完成之后必須在路由規(guī)則方法(RegisterRoutes)里面進(jìn)行注冊(cè),注冊(cè)代碼如下:

    ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers為控制器的類庫(kù)

// 源文件頭信息:
// copyright file="ControllersFactory.cs">
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 創(chuàng)建人:韓迎龍(kencery)
// 創(chuàng)建時(shí)間: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>
  /// 重寫注冊(cè)控制器的方法,使之能夠?qū)⒖刂破鞴芊蛛x到其它類庫(kù)中實(shí)現(xiàn)
  /// auther>
  ///   name>kencery/name>
  ///   date>2015-6-18/date>
  /// /auther>
  /// /summary>
  /// 說(shuō)明:IControllerFactory接口含有三個(gè)需要實(shí)現(xiàn)的方法:CreateController,GetControllerSessionBehavior,ReleaseController
  /// 使用:在MVC App_Start文件夾中的RouteConfig中的方法RegisterRoutes中的第一行中寫入下面注冊(cè)語(yǔ)句,Global.asax中也可注冊(cè),放到注冊(cè)路由之前即可
  /// ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers為控制器的類庫(kù)
  public class ControllersFactory : IControllerFactory
  {
    private readonly string _assemblyName;
    private readonly string _controlerDefaultNameSpage;
    private Assembly _controllerAssembly;

    /// summary>
    /// 獲取控制器所在的程序集名稱
    /// /summary>
    public string AssemblyName
    {
      get { return _assemblyName; }
    }

    /// summary>
    /// 獲取控制器的默認(rèn)命名空間
    /// /summary>
    public string ControlerDefaultNameSpage
    {
      get { return _controlerDefaultNameSpage; }
    }

    /// summary>
    /// 獲取控制器所在的程序集的Assembly實(shí)例
    /// /summary>
    public Assembly ControllerAssembly
    {
      get
      {
        return _controllerAssembly ?? (_controllerAssembly = Assembly.Load(AssemblyName)); //加載控制器信息
      }
    }

    /// summary>
    /// 構(gòu)造函數(shù)實(shí)例化
    /// /summary>
    /// param name="assemblyName">/param>
    public ControllersFactory(string assemblyName)
    {
      _assemblyName = assemblyName;
    }

    /// summary>
    /// 構(gòu)造函數(shù)實(shí)例化
    /// /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>
    /// 獲取控制器實(shí)例對(duì)象,根據(jù)controllerName生成一個(gè)沒有請(qǐng)求上下文對(duì)象的空的控制器,在為此控制器制定ControllerContext對(duì)象,然后返回控制器實(shí)例
    /// /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>
    /// 返回請(qǐng)求的會(huì)話狀態(tài)的支持類型
    /// /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();
      }
    }
  }
}

第二種方法

  路由注冊(cè)方法代碼如下:缺點(diǎn)是,如果有多個(gè)注冊(cè)路由的規(guī)則,都必須記得添加namespaces屬性,否則會(huì)出現(xiàn)錯(cuò)誤

//系統(tǒng)默認(rèn)路由
    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從控制器傳遞數(shù)據(jù)到視圖的四種方式詳解
  • Asp.net MVC中獲取控制器的名稱的方法
  • ASP.NET在MVC控制器中獲取Form表單值的方法
  • ASP.NET MVC4入門教程(五):從控制器訪問(wèn)數(shù)據(jù)模型
  • ASP.NET MVC4入門教程(二):添加一個(gè)控制器
  • ASP.NET中MVC從后臺(tái)控制器傳遞數(shù)據(jù)到前臺(tái)視圖的方式
  • ASP.NET MVC 控制器與視圖
  • 詳解Asp.Net MVC——控制器與動(dòng)作(Controller And Action)

標(biāo)簽:烏蘭察布 西雙版納 隨州 威海 梧州 廣西 甘孜 開封

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET MVC中將控制器分離到類庫(kù)的實(shí)現(xiàn)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266