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

  [复制链接]
查看: 79|回复: 1
  • 慵懒
    2018-4-28 09:37
  • 发表于 2018-4-3 09:22:50 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    这篇文章主要介绍了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"}
    );




    发表于 2018-9-13 10:37:56 | 显示全部楼层
    专业抢沙发的!哈哈
    回复

    使用道具 举报

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

    本版积分规则

     
     
    技术支持
    在线客服
    售后交流群瑞恩社区™售后</font><br><span>交流
    工作时间:
    8:00-18:00
    客服热线:
    15368564009
    微信扫一扫
    返回顶部 关注微信 下载APP 返回列表