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

[复制链接]
查看: 26|回复: 0
  • TA的每日心情
    慵懒
    2018-4-28 09:37
  • 1459

    主题

    1485

    帖子

    11万

    积分

    管理员

    小语

    Rank: 9Rank: 9Rank: 9

    积分
    110351
    发表于 2018-4-3 09:22:50 | 显示全部楼层 |阅读模式
    这篇文章主要介绍了ASP.NET MVC中将控制器分离到类库的实现的相关资料,需要的朋友可以参考下


            前言

      在、ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就像Controller是不是也能够分离出去呢?答案是肯定的,下面我们探讨一下Controller如何分离出去。

      这里我提供两种分离的方法,一是重写方法继承自IControllerFactory接口,实现里面的方法,二是MVC提供了直接在路由注册里面去控制控制器的书写,下面就这两种类型简单贴一下代码。

    第一种方法

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

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

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    // 源文件头信息:
    //
    // 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();
    }
    }
    }
    }


    第二种方法

      路由注册方法代码如下:缺点是,如果有多个注册路由的规则,都必须记得添加namespaces属性,否则会出现错误

    ?
    1
    2
    3
    4
    5
    6
    7
    //系统默认路由
    routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new {controller = "Login", action = "Index", id = UrlParameter.Optional},
    namespaces: new string[] {"BookSystem_Controllers"}
    );




    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在线客服
    热线电话

    微信公众账号
    返回顶部 关注微信 下载APP 返回列表