当前位置: 首页 > 编程笔记 >

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

熊哲圣
2023-03-14
本文向大家介绍ASP.NET MVC中将控制器分离到类库的实现,包括了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为控制器的类库

// 源文件头信息:
// <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"}
);

 类似资料:
  • 我需要调用这个API在我的控制器得到它的数据。 这是我的控制器 以下是XML响应的外观:

  • 问题内容: 试图找到构建Angular App的“最佳”方法,我发现了几篇最佳实践文章。通过此输入,我做到了: HTML模板就是这样: 所以我的问题是,是否应该将数据更改视为DOM操作?在控制器中执行此操作的当前版本对我来说似乎更实用(例如,设置默认值)。另外,如果我为此添加更多功能,则“指令链接”块将增加并且包含比定义更多的功能。我猜应该在指令中执行诸如更改颜色或根据范围数据隐藏元素之类的事情。

  • 编辑:我才明白问题到底出在哪里。我需要构造函数从超类获取信息。因此,我需要像这样扩展类中的超类: 如果取消对extends favoriten部分的注释,它将加载构造函数和initialize方法。

  • 这个问题主要是关于在Java-Swing中实现MVC体系结构的标准实践。我知道以前有人问过这个问题,但我想更具体地介绍一下控制器的使用。 我一直在分离我的模型、视图和控制器,其中: 数据在模型类内处理 Swing组件位于视图类中 事件处理匿名类也在视图类(用户输入)中 控制器类包含对模型和视图对象的引用 回到具体的控制器-我一直使用类(静态)变量来表示控制器,以方便应用程序的任何部分访问。因此我的

  • ...Spring implements a controller in a very abstract way, which enables you to create a wide variety of controllers. 控制器作为应用程序逻辑的处理入口,它会负责去调用你已经实现的一些服务。通常,一个控制器会接收并解析用户的请求,然后把它转换成一个模型交给视图,由视图渲染出页面最终呈现

  • 问题内容: 已关闭 。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 改善这个问题 我是嵌入式世界的新手。可能是我错了。但是我想要一个相关的解决方案。 我只想将Java环境嵌入到MCU中以便于开发应用程序。MCU供应商提供了用于LCD,传感器,spi,按钮,UART,DIO等的C库。我可以将Java嵌入到此库中吗?我的意思