189 8069 5689

ASP.NETMVC中实现将控制器分离到类库的方法有哪些-创新互联

本篇文章给大家分享的是有关ASP.NET MVC中实现将控制器分离到类库的方法有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联公司是一家专注于网站设计制作、成都网站制作与策划设计,太仓网站建设哪家好?成都创新互联公司做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:太仓等地区。太仓做网站价格咨询:18982081108

第一种方法


代码如下:当写完代码之后再路由中注册。提示:实现完成之后必须在路由规则方法(RegisterRoutes)里面进行注册,注册代码如下:

  ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers为控制器的类库

// 源文件头信息:
// 
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 创建人:韩迎龙(kencery)
// 创建时间:2015-6-18
// 

using System;
using System.Reflection;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.SessionState;

namespace BookSystem_Controllers
{
  /// 
  /// 重写注册控制器的方法,使之能够将控制器管分离到其它类库中实现
  /// 
  ///   kencery
  ///   2015-6-18
  /// 
  /// 
  /// 说明: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;

    /// 
    /// 获取控制器所在的程序集名称
    /// 
    public string AssemblyName
    {
      get { return _assemblyName; }
    }

    /// 
    /// 获取控制器的默认命名空间
    /// 
    public string ControlerDefaultNameSpage
    {
      get { return _controlerDefaultNameSpage; }
    }

    /// 
    /// 获取控制器所在的程序集的Assembly实例
    /// 
    public Assembly ControllerAssembly
    {
      get
      {
        return _controllerAssembly ?? (_controllerAssembly = Assembly.Load(AssemblyName)); //加载控制器信息
      }
    }

    /// 
    /// 构造函数实例化
    /// 
    /// 
    public ControllersFactory(string assemblyName)
    {
      _assemblyName = assemblyName;
    }

    /// 
    /// 构造函数实例化
    /// 
    /// 
    /// 
    public ControllersFactory(string assemblyName, string controlerDefaultNameSpage)
    {
      _assemblyName = assemblyName;
      _controlerDefaultNameSpage = controlerDefaultNameSpage;
    }

    /// 
    /// 获取控制器类的全名
    /// 
    /// 控制器名称
    public string GetControllerFullName(string controllerName)
    {
      return string.Format("{0}.{1}Controller",
        string.IsNullOrEmpty(ControlerDefaultNameSpage) ? AssemblyName : ControlerDefaultNameSpage,
        controllerName);
    }

    /// 
    /// 获取控制器实例对象,根据controllerName生成一个没有请求上下文对象的空的控制器,在为此控制器制定ControllerContext对象,然后返回控制器实例
    /// 
    /// 
    /// 
    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;
    }

    /// 
    /// 返回请求的会话状态的支持类型
    /// 
    /// 
    /// 
    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;
    }

    /// 
    /// 释放资源
    /// 
    /// 
    public void ReleaseController(IController controller)
    {
      var idDisposable = controller as IDisposable;
      if (idDisposable != null)
      {
        idDisposable.Dispose();
      }
    }
  }
}

本文标题:ASP.NETMVC中实现将控制器分离到类库的方法有哪些-创新互联
本文来源:http://cdxtjz.cn/article/jjpej.html

其他资讯