博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCLFramework框架之Plugin模式
阅读量:6230 次
发布时间:2019-06-21

本文共 2525 字,大约阅读时间需要 8 分钟。

插件应用架构概述


基于LCLFramework插件框架的应用由以下三个部分构成:

(1)主程序:针对特定应用环境(Web、WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序。

(2)插件:提供应用功能,实现对其它插件功能扩展并暴露功能扩展点。

(3)插件框架:与特定应用环境无关,实现插件功能组合与扩展。

主程序与插件的通讯


      主程序可以通过插件框架LEnvironment来注册和获取服务。

服务在这里表述为:服务 = 接口/基类 + 实现类。

 

Plugin模式在示例中的实际目的小结一下


  1. Plugin模式是架构模式,在设计架构时,才有参考价值;
  2. Plugin模式主要是实现单一职责的封装,和扩展应用程序;
  3. 目前的插件框架主要是Kernel+Core Plugins组成的结构体系;

Plugin与扩展的区别


      插件稍不同于扩展(extension),插件通常依赖于主应用程序的接口,有一个它们可以运行的确定的界限。扩展则通常有更少的限制,也可以提供它们自己的接口。相同的是,它们通常都用来减少主应用程序的大小、提供一些可选的功能。

       这里不得不提到Mozilla Firefox 和相关软件。它们使用一个叫做Add-on的名词,Add-on又被细分为插件、主题(theme)、搜索引擎(search engine)和扩展。在以后的文章中将会提到Mozilla插件和古老的NPAPI的渊源,以及firefox中插件和扩展的区别。

LCLFramework框架之Plugin设计


LCLFramework框架之Plugin模式主要是参考和框架来的。

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"/>

单机部署:

转载于:https://www.cnblogs.com/luomingui/p/4117558.html

你可能感兴趣的文章
android的service
查看>>
Java集合---HashMap源码剖析
查看>>
【互动问答分享】第4期决胜云计算大数据时代Spark亚太研究院公益大讲堂
查看>>
iOS UILabel 设置行高
查看>>
RAID配置与管理详解
查看>>
Sublime Text3—自定义代码片段(Code Snippets)
查看>>
【shell基础】07、bash脚本编程入门及变量
查看>>
php+redis实现多台服务器内网存储session并读取
查看>>
copy--mutableCopy用法(important)
查看>>
我的友情链接
查看>>
Linux命令——cut命令学习
查看>>
lync聊天过程中实现多国语言的即时沟通
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
如何在手机浏览器wap网页中点击链接跳转到微信界面
查看>>
Windows VM与宿主XenServer系统时间相差8小时
查看>>
【设计模式-策略模式】
查看>>
MyEclipse设置Java代码中注释的字体颜色
查看>>
thinkphp sql debug
查看>>
ecshop控制网站首页公告条数
查看>>