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

      一.前言

nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中。具体实现可以参考nopCommerce解决方案中Nop.Core项目的Plugins目录下的相关文件。其中PluginManager.cs文件是核心文件,包含了处理插件化的核心代码。

我们直接从nopCommerce3.5的实现中抽取必要的实现代码,制作一个简易版的插件系统Demo用于演示ASP.NET MVC的插件化,核心只包含一个标记接口IPlugin,一个管理类PluginManager包含2个必要方法Initialize和ReStart。

   二.新建主Web项目

主项目新建一个MVC项目,根目录和App_Data下新建一个plugins文件夹,

约定”~/Plugins”作为插件根目录。
     约定”~/Plugins/App_Data”作为中等信任级别下的运行时目录。

插件在运行时加载的是插件程序集在运行时目录的副本,不直接加载插件而是加载运行时目录中的副本的原因是避免插件升级或删除时dll文件被锁定。

用Neget引用:

    三.新建插件

约定插件名称要以”Plugin.”开头例如Plugin.Demo

1.新建一个MVC项目Plugin.Demo

2.引用Plugin.Interfaces.dll 和Plugin..dll  (项目packages里面或者通过nuget)

3.新建DemoPlugin 实现IPlugin 接口

具体代码:

using System.Reflection;
using System.Web.Mvc;
using System.Web.Routing;

namespace Plugin.Demo
{
    public class DemoPlugin :IPlugin
    {
        public string Name
        {
            get
            {
                return Assembly.GetExecutingAssembly().GetName().Name.Replace("Plugin.", "");
            }
        }

        public void Initialize()
        {
            var route = RouteTable.Routes.MapRoute(
                name: this.Name,
                url: this.Name+"/{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, pluginName = this.Name }
            );

            route.DataTokens["area"] = this.Name;
        }

        public virtual void Unload()
        {
            RouteTable.Routes.Remove(RouteTable.Routes[this.Name]);
        }
    }
}

  四.测试插件内容

手动拷贝:

1)把生成的bin文件夹、Views文件夹拷贝到主项目Plugins下的demo文件下

2)再把Plugin.Demo.dll拷贝到主项目App_data/plugins 下面

3)在主项目页面写个连接

@Html.ActionLink("Demo", "Index", "Home", new { area = "Demo" }, null)

看看能够访问到插件的内容了吗?如果能访问插件安装成功了

注意:bin文件夹只留Plugin.Demo.dll和自己新建的类库生成的Dll;如果有js、图片、样式等也需要拷贝的

自动拷贝:

右键项目-->属性-->生成事件  在后期生成事件命令行填写如下命令:

注意:如果项目无任何改动,“生成”是不会编译的,所以当运行生成后事件选中“生成更新项目输出时”,不会被执行,但“重新生成”会无条件的输出,并触发事件

时间: 2024-10-15 21:38:20

ASP.NET MVC5 插件化机制简单实现的相关文章

ASP.NET MVC 插件化机制

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

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

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

ASP.NET MVC5路由系统机制详细讲解

请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提供了路由机制,当IIS接受到一个请求时,会先看是否请求了一个静态资源(.html,css,js,图片等),这一步是web form和mvc都是一样的,如果不是则说明是请求的是一个动态页面,就会走asp.net的管道,mvc的程序请求都会走路由系统,会映射到一个Controller对应的Action方法,而web form请求动态页面是会查找本地实际存在一个aspx文件.下面通过一个ASP

Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现

一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目. 二.新建带有插件的项目 参考: ASP.NET MVC5 插件化机制简单实现 项目结构如下图: 三.建立DomainServices类库 新建一个ITestService接口,代码如下: namespace DomainServices { public interface ITestServi

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

Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现 一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目. 二.新建带有插件的项目 参考:ASP.NET MVC5 插件化机制简单实现 项目结构如下图: 三.建立DomainServices类库    新建一个ITestService接口,代码如下: namespace Dom

LBPL--基于Asp.net、 quartz.net 快速开发定时服务的插件化项目

LBPL 这一个基于Asp.net. quartz.net 快速开发定时服务的插件化项目 由于在实际项目开发中需要做定时服务的操作,大体上可以理解为:需要动态化监控定时任务的调度系统. 为了实现快速开发.简单明了完成一个服务,不再繁琐的进行各种代码耦合度强的操作,设计了一个以暂时以quartz.net 为服务载体,插件化开发的模式. github地址:https://github.com/linbin524/LBPL 由于工作比较忙,暂时更新部分,后续会将相关的开发文档更新. 主要开发流程 1.

小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代理真的非常简单,只不过就是实现一个 InvocationHandler 接口重写一下 invoke 方法而已.不错,其实很多看似 high level 的技术都并没有想象中的那么晦涩难懂,只要你肯下定决心去了解它,去认识它,去学习它你就会发现,原来都是可以学得懂的.本篇博文将介绍 DroidPlugin 框架

ASP.Net请求处理机制简单探索之旅 - Part 1 前奏

开篇:ASP.Net是一项动态网页开发技术,在历史发展的长河中WebForm曾一时成为了ASP.Net的代名词,而ASP.Net MVC的出现让这项技术更加唤发朝气.但是,不管是ASP.Net WebForm还是ASP.Net MVC在请求处理机制上大部分都是相同的,只是在请求处理管道上的处理事件做了不同的操作,因此,本文标题不区分ASP.Net WebForm和ASP.Net MVC,但在后续的介绍中会区分开来介绍. (1)Part 1:前奏 (2)Part 2:核心 (3)Part 3:管道

Linux下配置Mono和Jexus并且部署ASP.NET MVC5

1.开篇说明 本文转自霍力强的专栏http://blog.csdn.net/hliq5399/article/details/54310872 2.Mono和Jexus简单说明 a. Mono是由Novell公司(由Xamarin(已被微软收购并且将会开源,前途一片光明)发起,一个致力于开创.NET在Linux上使用的开源工 程.它包含了一个C#语言的编译器,一个CLR的运行时和一组类库,并且实现了ADO.NET和ASP.NET,能够使的开发人员在Linux下用C#开 发程序.)主持的项目,该项