MVC项目插件化改造

  现在正在做的项目是以长沙某个客户的需求为原型进行开发的,随着业务的拓展,其他城市相同行业的客户也有类似的需求,在进行投标时,每个客户都有自己的页面和功能要求,如果单纯用长沙客户的软件版本,无法完全满足标书要求,因此需要对项目进行改造,考虑采用MVC插件化方式。

  现有项目使用的技术点主要是MVC+EF+jQuery,改造思路考虑将每一个功能模块抽取为一个插件,在主Web项目中引用各插件,并将插件的css、js、views等文件拷贝到主Web项目的Plugins文件夹下。当有新客户提出个性化需求时,将涉及到的模块插件复制一份,然后进行个性化改造,新插件和原插件在mvc 路由上一模一样,插件的名称也一样,这样对于主Web项目来说两个插件就如同一个一样。项目其他层(Biz、Model等其他类库)保持不变。

  具体改造方法:

  插件是一个MVC项目,要求必须包含:Controllers(控制器)、Models(ViewModel)、Content(样式表)、Scripts、Views文件夹。

  

  项目属性中的生成事件中,添加后期生成事件命令行:

rd /s /q $(SolutionDir)MyApplication.Web\Plugins\Device

xcopy /s /y $(ProjectDir)Views $(SolutionDir)MyApplication.Web\Plugins\Device\Viewsxcopy /s /y $(ProjectDir)Content $(SolutionDir)MyApplication.Web\Plugins\Device\Contentxcopy /s /y $(ProjectDir)Scripts $(SolutionDir)MyApplication.Web\Plugins\Device\Scripts\

  分别用于:清空删除主Web项目插件目录、拷贝视图文件夹到主Web项目、拷贝样式表文件夹到主Web项目、拷贝js文件夹到主Web项目。这样就能实现在插件编译通过后,自动将相应的插件文件复制到主Web项目的Plugins下,方便调试。

  

  每个插件中都添加一个自启动类(要求是静态的)PluginStartUp,类中包含:插件名称、初始化方法、Razor静态文件导入扩展(css、js)。

  1.自启动类属性

  .Net Framework 4.0后提供了PreApplicationStartMethodAttribute属性,提供对应用程序启动的扩展支持。

  https://msdn.microsoft.com/zh-cn/library/system.web.preapplicationstartmethodattribute.aspx

  使用时,将PreApplicationStartMetod的声明写在自启动类的命名空间前。

[assembly: System.Web.PreApplicationStartMethod(typeof(MyApplication.Plugins.Device.PluginStartUp), "Init")]

namespace MyApplication.Plugins.Device
{
    /// <summary>
    /// 插件自启动类,用于注册插件
    /// </summary>
    public static class PluginStartUp
    {

    }

 }

  2.插件名称

  插件名称为自启动类的属性,作为本插件的唯一标识。

        public static string Name
        {
            get
            {
                return "Device";
            }
        }

  3.插件初始化方法

  初始化包括注册路由和Razor视图引擎。

  将插件中的Controller注册为一个Area,主Web项目引用插件后就会把每一个插件当作一个域。

  注册视图引擎,主要是添加View的寻找路径,即/Plugins/插件名称/Views 路径。

        /// <summary>
        /// 插件初始化
        /// </summary>
        public static void Init()
        {
            RegRoute();
            RegViewEngine();
        }

        /// <summary>
        /// 注册视图引擎
        /// </summary>
        private static void RegViewEngine()
        {
            ViewEngines.Engines.Add(new RazorViewEngine { AreaViewLocationFormats = new[] { "~/Plugins/" + Name + "/Views/{1}/{0}" } });
        }

        /// <summary>
        /// 注册插件路由
        /// </summary>
        public static void RegRoute()
        {
            RouteTable.Routes.MapRoute(
                "Device",
                "/Device/{controller}/{action}/{id}",
                new { controller = "DeviceHome", action = "Index", id = UrlParameter.Optional }).DataTokens["area"] =
                Name;
        }

  4.Razor扩展方法

  在View页面中引入css和js文件时,如果用插件中的相对路径,在引入到主Web项目后则会找不到文件,因此需要提供一个导入css和js文件的Html扩展方法,在View页面中使用该方法引入文件,方法内将路径格式化。

        /// <summary>
        /// 导入css, Razor Html扩展
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="cssName"></param>
        /// <returns></returns>
        public static IHtmlString ImportCss(this HtmlHelper helper, string cssName)
        {
            return helper.Raw(string.Format("<link href=\"/Plugins/{0}/Content/{1}\" type=‘text/css‘ rel=‘stylesheet‘ />", Name, cssName));
        }

        /// <summary>
        /// 导入js, Razor Html扩展
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="jsName"></param>
        /// <returns></returns>
        public static IHtmlString ImportJs(this HtmlHelper helper, string jsName)
        {
            return helper.Raw(string.Format("<script src=\"/Plugins/{0}/Scripts/{1}\" ></script>", Name, jsName));
        }

  在View页面内,使用这两个扩展方法引入文件。

@Html.ImportCss("device.css")

@Html.ImportJs("device.js")

  以上就完成了原项目插件化的改造。主Web项目添加对插件的引用,当项目启动时,PluginStartUp类自动运行完成插件初始化。

  当有新项目个性化需求时,只需将插件复制一份,并修改插件内的controller、view、content、scripts等,Biz、Model都无需变化(前提是项目的主业务流程是一致的),主Web项目也无需变动,发布时,根据项目的情况,需要哪些插件就在Plugins下面保留哪些插件即可。

时间: 2025-02-01 08:47:23

MVC项目插件化改造的相关文章

Docker---大型项目容器化改造

虚拟化和容器化是项目云化不可避免的两个问题.虚拟化由于是纯平台操作,一个运行于linux操作系统的项目几乎不需要做任何改造就可以支持虚拟化.而项目如果要支持容器化则需要做许多细致的改造工作.容器化相对于虚拟化的优势也相当明显,运行于裸机性能高,秒级启停容器,更不用说开发.测试.布署一致的环境(DevOps理念),以及上篇提到的微服务的能力.大家还可以找到各种文章来介绍容器化(Docker)的知识,这里我们就不一一赘述.下面我们会根据项目的实际情况,介绍下容器化改造会面临的问题和解决方案. 一个几

Asp.Net MVC 插件化开发简化方案

Web 管理系统可以庞大到不可想像的地方,如果想就在一个 Asp.Net MVC 项目中完成开发,这个工程将会变得非常庞大,协作起来也会比较困难.为了解决这个问题,Asp.Net MVC 引入了 Areas 的概念,将模块划分到 Area 中去--然而 Area 仍然是主项目的一部分,多人协作的时候仍然很容易造成 .csproj 项目文件的冲突. 对于这类系统,比较好的解决办法是采用 SOA 的方式,把一个大的 Web 系统划分成若干微服务,通过一个含授权中心的 Web 集散框架组织起来.不过这

ASP.NET MVC 插件化机制

概述 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具体实现可以参考nopCommerce解决方案中Nop.Core项目的Plugins目录下的相关文件.其中PluginManager.cs文件是核心文件,包含了处理插件化的核心代码.nopCommerce的注释中感谢了其参考的Umbraco项目,并给出了主要参考文章的链接. 我们直接从nopCommerce

ASP.NET MVC5 插件化机制简单实现

      一.前言 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具体实现可以参考nopCommerce解决方案中Nop.Core项目的Plugins目录下的相关文件.其中PluginManager.cs文件是核心文件,包含了处理插件化的核心代码. 我们直接从nopCommerce3.5的实现中抽取必要的实现代码,制作一个简易版的插件系统Demo用于演示A

Android热修复与插件化实践之路

第1章 class文件与dex文件解析本章通过从java最基本的class文件与android最基本的dex文件进行对比,并不借助IDE去生成及执行class与dex文件,通过讲解class与dex的手动生成,执行, 格式对比,让学生明白二者的相同与不同.1-1 课程项目整体介绍1-2 本章概述1-3 class文件详解上1-4 class文件详解下1-5 dex文件详解上1-6 dex文件详解下 第2章 虚拟机深入讲解本章主要介绍jvm,dvm,art.通过对这三个虚拟机的介绍让学生明白,an

Android插件化框架

1.   dynamic-load-apk/DL动态加载框架 是基于代理的方式实现插件框架,对 App 的表层做了处理,通过在 Manifest 中注册代理组件,当启动插件组件时,首先启动一个代理组件,然后通过这个代理组件来构建,启动插件组件. 需要按照一定的规则来开发插件 APK,插件中的组件需要实现经过改造后的 Activity.FragmentActivity.Service 等的子类. 优点如下: 动态升级, 高效并行开发(编译速度更快) 按需加载,内存占用更低等等DynamicLoad

基于.NET MVC的高性能IOC插件化架构

基于.NET MVC的高性能IOC插件化架构 最近闲下来,整理了下最近写的代码,先写写架构,后面再分享几个我自己写的插件 最近经过反复对比,IOC框架选择了Autofac,原因很简单,性能出众,这篇博文是我的各大IOC框架的性能测试:http://www.cnblogs.com/gengzhe/p/4370979.html 我先分析下我的系统架构: 这是整体结构图,先简单介绍下:Sun.Core是系统核心,包含了系统必要组件及基础设施的所有接口及必要拓展类.Sun.Framework是整个系统的

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

MVC 插件化框架支持原生MVC的Area和路由特性

.NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribute等路由特性标签,按照先前的做法,无法解析插件的路由特性和Areas,所以花费了两个晚上的时间,把插件给改进到支持Areas和路由特性,但同时也放弃了Web类插件的热插拔,Func类的插件依然支持热插拔. 下面是实现支持插件使用Areas和路由特性标签的流程: 原生的MVC在启动的时候需要执行两条代