当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET MVC中将控制器分离到类库的实现

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

表白情书范文,报酬的近义词,呵

前言

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网