欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2015年06月25日 11:06:21   投稿:hebedich  
這篇文章主要介紹了ASP.NET MVC中將控制器分離到類庫的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下

前言

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

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

第一種方法

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

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

// 源文件頭信息:
// <copyright file="ControllersFactory.cs">
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 創(chuàng)建人:韓迎龍(kencery)
// 創(chuàng)建時間: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>
  /// 重寫注冊控制器的方法,使之能夠?qū)⒖刂破鞴芊蛛x到其它類庫中實現(xiàn)
  /// <auther>
  ///   <name>kencery</name>
  ///   <date>2015-6-18</date>
  /// </auther>
  /// </summary>
  /// 說明:IControllerFactory接口含有三個需要實現(xiàn)的方法: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>
    /// 獲取控制器的默認(rèn)命名空間
    /// </summary>
    public string ControlerDefaultNameSpage
    {
      get { return _controlerDefaultNameSpage; }
    }

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

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

    /// <summary>
    /// 構(gòu)造函數(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>
    /// 獲取控制器實例對象,根據(jù)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>
    /// 返回請求的會話狀態(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();
      }
    }
  }
}

第二種方法

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

//系統(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"}
);

相關(guān)文章

  • asp.net開發(fā)與web標(biāo)準(zhǔn)的沖突問題的一些常見解決方法

    asp.net開發(fā)與web標(biāo)準(zhǔn)的沖突問題的一些常見解決方法

    Visual Studio .net從2003到現(xiàn)在的2008,一路走來慢慢強(qiáng)大……從以前的vs2003能自動改亂你的html代碼到現(xiàn)在在vs2008中都能直接對html代碼進(jìn)行w3c標(biāo)準(zhǔn)驗證并提示了,非常不易。
    2009-02-02
  • asp.net 支付寶及時到帳接口使用詳解

    asp.net 支付寶及時到帳接口使用詳解

    這兩天寫支付寶接口, 這個話題不新了, 因為很多人都 做過了, 在這里我說說我的看法吧, 先說一下實現(xiàn)
    2010-03-03
  • asp.net(C#)使用QRCode生成圖片中心加Logo或圖像的二維碼實例

    asp.net(C#)使用QRCode生成圖片中心加Logo或圖像的二維碼實例

    這篇文章主要介紹了asp.net(C#)使用QRCode生成圖片中心加Logo或圖像的二維碼,結(jié)合實例形式詳細(xì)分析了asp.net基于QRCode生成二維碼的具體實現(xiàn)技巧,需要的朋友可以參考下
    2016-06-06
  • ASP.NET 保留文件夾詳解

    ASP.NET 保留文件夾詳解

    在一個ASP.NET應(yīng)用程序中有許多保留文件夾
    2009-04-04
  • 一個完整的ASP.NET 2.0 URL重寫方案[翻譯]

    一個完整的ASP.NET 2.0 URL重寫方案[翻譯]

    這篇文章描述了一個完整的 ASP.NET 2.0 URL 重寫方案。這個方案使用正則表達(dá)式來定義重寫規(guī)則并解決通過虛擬 URLs 訪問頁面產(chǎn)生回發(fā)事件的一些可能的困難。
    2009-11-11
  • ASP.Net下載大文件的實現(xiàn)方法

    ASP.Net下載大文件的實現(xiàn)方法

    這篇文章主要介紹了ASP.Net下載大文件的實現(xiàn)方法,較為詳細(xì)的分析了實現(xiàn)大文件下載的思路及具體注意事項,需要的朋友可以參考下
    2015-01-01
  • Asp.net中判斷一個session是否合法的方法

    Asp.net中判斷一個session是否合法的方法

    今天突然想到一個判斷session是否合法的做法,asp.net的,之前我們的做法是下面這樣的形式的:
    2013-07-07
  • 一個簡單MVC5 + EF6示例分享

    一個簡單MVC5 + EF6示例分享

    本文小編跟大家分享了一個簡單MVC5 + EF6示例,感興趣的小伙伴們可以參考一下
    2015-09-09
  • ASP.NET中TimeSpan的用法實例解析

    ASP.NET中TimeSpan的用法實例解析

    這篇文章主要介紹了ASP.NET中TimeSpan的用法,以實例的形式具體分析了TimeSpan應(yīng)用中的各種常見常量、字段、屬性與方法等,非常具有參考學(xué)習(xí)價值,需要的朋友可以參考下
    2014-10-10
  • asp.net中資源文件的使用

    asp.net中資源文件的使用

    .Net是一個豐富的平臺,在它的結(jié)構(gòu)中,程序集Assembly是自我描述的安裝單元,它可以只包括一個PE(可移植可執(zhí)行)格式的Dll或exe文件,也可以由多個文件組成,例如資源、Dll和exe等
    2011-12-12

最新評論