LCLFramework框架之Plugin模式
插件应用架构概述
基于LCLFramework插件框架的应用由以下三个部分构成:
(1)主程序:针对特定应用环境(Web、WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序。
(2)插件:提供应用功能,实现对其它插件功能扩展并暴露功能扩展点。
(3)插件框架:与特定应用环境无关,实现插件功能组合与扩展。
主程序与插件的通讯
主程序可以通过插件框架LEnvironment来注册和获取服务。
服务在这里表述为:服务 = 接口/基类 + 实现类。
Plugin模式在示例中的实际目的小结一下
- Plugin模式是架构模式,在设计架构时,才有参考价值;
- Plugin模式主要是实现单一职责的封装,和扩展应用程序;
- 目前的插件框架主要是Kernel+Core Plugins组成的结构体系;
Plugin与扩展的区别
插件稍不同于扩展(extension),插件通常依赖于主应用程序的接口,有一个它们可以运行的确定的界限。扩展则通常有更少的限制,也可以提供它们自己的接口。相同的是,它们通常都用来减少主应用程序的大小、提供一些可选的功能。
这里不得不提到Mozilla Firefox 和相关软件。它们使用一个叫做Add-on的名词,Add-on又被细分为插件、主题(theme)、搜索引擎(search engine)和扩展。在以后的文章中将会提到Mozilla插件和古老的NPAPI的渊源,以及firefox中插件和扩展的区别。
LCLFramework框架之Plugin设计
LCLFramework框架之Plugin模式主要是参考http://www.cnblogs.com/zgynhqf/p/3356692.html和http://mvcpluginframework.codeplex.com/框架来的。
1:定义插件程序集搜索目录 搜索/Plugins 和 /Plugins/Bin文件夹。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin/Plugins;Plugins;Plugins/bin"/>
</assemblyBinding>
</runtime>
2:把Plugins文件夹下的文件复制到临时目录再加载程序集到内存。
3:执行插件自定义的Initialize函数来初始化插件本身。
ASP.NET MVC Plugin 设计
4:在插件程序集中加入 BuildManager.AddReferencedAssembly。
5:定义PluginView视图。
6:插件控制器工厂PluginControllerFactory查找插件控制器。
7:定义插件开发常用功能,如:URL查找。
注意:
插件中的 web.config 文件是为了让 .cshtml 有智能感知提示
每个插件都需要有一个类(只能有一个)继承LCLPlugin来表示这是一个LCLPlugin
LCLFramework框架之Plugin开发
LCLFramework框架之MVC Plugin开发
public class HeatMeteringPlugin : LCLPlugin
{
public override void Initialize(IApp app)
{
Bundle = this;
Debug.WriteLine("HeatMeteringPlugin Initialize....");
app.AllPluginsIntialized += app_AllPluginsIntialized;
app.ModuleOperations += app_ModuleOperations;
}
void app_ModuleOperations(object sender, System.EventArgs e)
{
Debug.WriteLine("HeatMeteringPlugin app_ModuleOperations Meuns....");
CommonModel.Modules.AddRoot(new ModuleMeta
{
Label = "收费管理",
Image = "glyphicon glyphicon-bell",
Children =
{
new ModuleMeta{ Label = "面积收费", CustomUI="/HeatMeteringPlugin/HMBase/Index"},
new ModuleMeta{ Label = "计量收费", CustomUI="/HeatMeteringPlugin/Village/Index"},
new ModuleMeta{ Label = "欠费催缴", CustomUI="/HeatMeteringPlugin/HMBase/Index"},
}
});
}
void app_AllPluginsIntialized(object sender, System.EventArgs e)
{
Debug.WriteLine("HeatMeteringPlugin app_AllPluginsIntialized IOC....");
//注册IOC
ServiceLocator.Instance.Register<DbContext, AppDbContext>();
ServiceLocator.Instance.Register<IRepository<Village>, EntityFrameworkRepository<Village>>();
}
}
LCLFramework框架之Plugin部署
B/S部署:直接把插件发布到网站上的Plugins目录下。
应用程序部署:直接把插件复制到应用程序的Plugins目录下。
C/S部署:<add key="DataPortalProxy" value="LCL.DataPortal.DataPortalClient.WcfProxy,LCL"/>
单机部署:
LCLFramework框架之Plugin模式的更多相关文章
- LCLFramework框架之Service模式
Service模式介绍 领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,一些动作,而不是事物.这些操作或动作往往会涉及到多个领域对象,并且需要协调这些领域对象 ...
- LCLFramework框架之Repository模式
Respository模式在示例中的实际目的小结一下 Repository模式是架构模式,在设计架构时,才有参考价值: Repository模式主要是封装数据查询和存储逻辑: Repository模式 ...
- LCLFramework框架 1.1 Pre-Alpha 源码公布
使用开发框架的好处:1.框架在技术上为软件系统提供了完整的模式实践2.框架为团队提供了合理可行的软件开发过程模式3.框架的应用大大提高了团队的开发效率,团队只需要关注与领域相关的业务实现,而无需关注具 ...
- EF框架之三种模式
使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. Entity Framewo ...
- LCLFramework框架之数据门户
LCLFramework框架之数据门户职责 形成统一的数据访问方式. LCLFramework框架之数据门户设计 数据门户分为客户端/服务端. LCLFramework框架之数据门户设计代码 数 ...
- LCLFramework框架之IOC
我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 借助于"第三方"实现具有依赖关系的对象之间的解 ...
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)
转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ...
- web开发中的MVC框架与django框架的MTV模式
1.MVC 有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model- ...
- [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
随机推荐
- fgetc和fputc函数
1.输入函数 以下三个函数可用于一次读一个字符. #include <stdio.h> int getc( FILE *fp ); int fgetc( FILE *fp ); int g ...
- Python成长笔记 - 基础篇 (五)
1.装饰器: 装饰器:器代表函数的意思,装饰器就是一个函数,作用是用来装饰其他的函数 原则: 1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 实现装饰器所需要的知识: 1.函数即变量 ...
- 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转
最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...
- 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)
湫湫系列故事――减肥记I HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...
- CentOS 一个网卡设置多个IP
方法1:少量IP手动绑定: (这里以绑定IP到eth0为例,其它网卡的话修改相应的文件名即可) 1.复制ifcfg-eth0的网卡配置文件并改名为ifcfg-eth0:0 [root@akinlau ...
- 移植到Windows CE 的经验
Windows CE 是微软早期推出的嵌入式设备和移动设备的开发运行平台,虽然目前移动端几乎都是android和ios的天下,但是,在嵌入式设备领域,Windows CE仍然占有一块地盘.很多用户希望 ...
- 第十一章:Android数据存储(上)
数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Androi ...
- 手机H5 web调试利器——WEINRE (WEb INspector REmote)
手机H5 web调试利器--WEINRE (WEb INspector REmote) 调试移动端页面,优先选择使用chrome浏览器调试,如果是hybrid形式的页面,可以使用chrome提供的ch ...
- [Java Web整合开发王者归来·刘京华] 2、 Java Web开发概述
1.Web相关概念 1-1.胖客户与瘦客户 >_<" RCP的定义及优缺点: >_<"TCP的定义及优缺点: 1-2.B ...
- JavaScript-冒泡排序
随机生成10个不重复的100以内的整数放入数组,并排序后进行打印<br /> 如: for(var i=0;i<9;i++) { for(var j=i+1;j<9;j++) ...