.NET MVC 简单的插件式开发
插件式开发的优势
1.提高软件的复用度
2.提高软件开发的并行性
3.缩短软件的研发周期、节约研发成本,带给程序开发人员更多的灵活性,产品在软件发布以后还可以添加新的插件和完善已有的功能。
4.方便软件的升级和维护。传统的应用程序因为采用单一的固定的模块,功能模块不易维护和替换,但是插件却可以动态的变更功能,对软件的升级和维护带来很大的帮助
5.可以满足用户不断变化的需求,缩短项目交付周期,而这传统点体系机构很难满足和实现。
6.提供了更多的开发可能性
简单实现步骤
1.新建一个空的MVC项目。要求必须包含:Controllers(控制器)、Models(ViewModel)、Content(样式表)文件夹。

2.在项目根目录下新建一个自启动类,用于注册插件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace DBI.SaaS.STaxDeclaration.Module
{
/// <summary>
/// 小规模纳税人申报插件
/// </summary>
public class STaxDeclarationPlugin : DBI.SaaS.Base.SaaSPlugin
{
}
}
我这里是继承了SaaSPlugin类,不过
.Net Framework 4.0后提供了PreApplicationStartMethodAttribute属性,提供对应用程序启动的扩展支持。
https://msdn.microsoft.com/zh-cn/library/system.web.preapplicationstartmethodattribute.aspx
使用时,将PreApplicationStartMetod的声明写在自启动类的命名空间前。
SaaSPlugin:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web; namespace DBI.SaaS.Base
{
public abstract class SaaSPlugin : IPlugin
{
/// <summary>
///插件名称
/// </summary>
private string _pluginName; /// <summary>
/// 当前插件的名称
/// </summary>
/// <value>The name of the plugin.</value>
public string PluginName
{
get
{
return _pluginName;
}
} /// <summary>
/// 添加插件前执行方法
/// </summary>
protected virtual void BeforeInit() { } /// <summary>
/// Initializes this instance.
/// </summary>
protected virtual void Init(){ } protected virtual void EndInit() { } public void Run()
{
this.BeforeInit();
this._pluginName = this.GetType().Assembly.GetName().Name;
this.Init();
this.EndInit();
}
}
}
SaaSPlugin下有插件名称为自启动类的属性,作为本插件的唯一标识。
有插件初始化方法。
我这里的初始化是去读xml文件,所以要添加xml文件里面内容
3.配置XML
<?xml version="1.0" encoding="utf-8" ?>
<plugins>
<plugin name="DBI.SaaS.Edu.Module.EduPlugin" assembly="DBI.SaaS.Edu.Module" />
<!--<plugin name="DBI.SaaS.ExtAPI.Module.ExtApiPlugin" assembly="DBI.SaaS.ExtAPI.Module" />-->
<plugin name="DBI.SaaS.STaxDeclaration.Module.STaxDeclarationPlugin" assembly="DBI.SaaS.STaxDeclaration.Module" />
<plugin name="DBI.SaaS.XSYAPI.Module.XSYAPIPlugin" assembly="DBI.SaaS.XSYAPI.Module" /> </plugins>
4.设置后期生成事件命令
在该MVC项目属性中的生成事件中,添加后期生成事件命令行:
xcopy "$(ProjectDir)\Views" "$(SolutionDir)\DBI.SaaS.Web\Plugins\$(ProjectName)\Views\" /s/i/y xcopy "$(ProjectDir)\Modules" "$(SolutionDir)\DBI.SaaS.Web\Plugins\$(ProjectName)\Modules\" /s/i/y xcopy "$(ProjectDir)\Content" "$(SolutionDir)\DBI.SaaS.Web\Plugins\$(ProjectName)\Content\" /s/i/y
分别用于:拷贝视图文件夹到主Web项目、拷贝样式表文件夹到主Web项目、拷贝Modules文件夹到主Web项目。这样就能实现在插件编译通过后,自动将相应的插件文件复制到主Web项目的Plugins下,方便调试。

5.主项目引用该项目,生成

最终效果

.NET MVC 简单的插件式开发的更多相关文章
- MVC 插件式开发
MVC 插件式开发 在开发一个OA系统是,我们可能遇到 A模块. B模块 .C模块,这也模块组成一个完整的系统,买给客服.现在又有一个客服要我们做一个OA系统,唉我们发现,跟上一个OA系统差不多,但没 ...
- 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用ApplicationPart动态加载控制器和视图
标题:从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 作者:Lamond Lu 地址:http://www.cnblogs ...
- 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板
标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...
- 零基础ASP.NET Core MVC插件式开发
零基础ASP.NET Core MVC插件式开发 一个项目随着业务模块的不断增加,系统会越来越庞大.如果参与开发的人员越多,管理起来也难度也很大.面对这样的情况,首先想到的是模块化插件式开发,根据业务 ...
- 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装
标题:从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11260750. ...
- 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级
标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...
- 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用
标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/1171 ...
- 从零开始实现ASP.NET Core MVC的插件式开发(七) - 近期问题汇总及部分解决方案
标题:从零开始实现ASP.NET Core MVC的插件式开发(七) - 问题汇总及部分解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/12 ...
- 从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案
标题:从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun ...
随机推荐
- 元组Tuple的使用
在方法中有多个值返回,返回值封装成对象又不方便,可以用 out 返回或ref返回, 这里介绍元组,也可以作为多个返回值的使用,最多携带8个返回值 Task.Factory.StartNew<Tu ...
- phpcms2008远程代码执行漏洞
phpcms2008远程代码执行漏洞 描述: 近日,互联网爆出PHPCMS2008代码注入漏洞(CVE-2018-19127).攻击者利用该漏洞,可在未授权的情况下实现对网站文件的写入.该漏洞危害程度 ...
- [Swift]LeetCode731. 我的日程安排表 II | My Calendar II
Implement a MyCalendarTwoclass to store your events. A new event can be added if adding the event wi ...
- 【机器学习】--Kmeans从初识到应用
一.前述 Kmeans算法一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点. Kmeans算法是一种无监督的算法. 常用于分组,比如用户偏好. 二.概念及原理 Km ...
- 解决 python 读取文件乱码问题(UnicodeDecodeError)
解决 python 读取文件乱码问题(UnicodeDecodeError) 确定你的文件的编码,下面的代码将以'utf-8'为例,否则会忽略编码错误导致输出乱码 解决方案一 with open(r' ...
- 安装需要的第三方库时,命令行输入pip提示不是内部或外部命令
简介 在做Python开发时,安装需要的第三方库时,大多数人喜欢选择在命令行用pip进行安装. 然而有时敲入pip命令会提示‘pip’不是内部或外部命令..如图: 解决办法 1.在python安装目录 ...
- CDN边缘节点容器调度实践(下)
5月27日,OSC 源创会在上海成功举办.又拍云系统开发高级工程师黄励博在大会分享了<CDN 边缘节点容器调度的实践>.主要介绍又拍云自主开发的边缘节点容器调度方案,从 0 到 1 ,实现 ...
- qt系统托盘显示、无主窗体
系统图盘是应用程序经常用到的一个控件,当应用程序需要长时间存在的时候,这个控件会变得非常有用,比如,窗口隐藏,显示,关于.关闭等接口都可以放在图盘中处理,今天与到一个问题,需求是这样的:只需要显示图盘 ...
- redis 系列25 哨兵Sentinel (高可用演示 下)
一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS 7.4.1708 IP地址 172.168.18.200 网关Gateway 1 ...
- Python爬虫入门教程 6-100 蜂鸟网图片爬取之一
1. 蜂鸟网图片--简介 国庆假日结束了,新的工作又开始了,今天我们继续爬取一个网站,这个网站为 http://image.fengniao.com/ ,蜂鸟一个摄影大牛聚集的地方,本教程请用来学习, ...