zoukankan      html  css  js  c++  java
  • LCLFramework框架之Plugin模式

    插件应用架构概述


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

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

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

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

    clipboard[6]

    主程序与插件的通讯


    clipboard[7]

          主程序可以通过插件框架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模式主要是参考http://www.cnblogs.com/zgynhqf/p/3356692.htmlhttp://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函数来初始化插件本身。

    clipboard[7]

    ASP.NET MVC Plugin 设计


    4:在插件程序集中加入 BuildManager.AddReferencedAssembly

    5:定义PluginView视图。

    clipboard[8]

    6:插件控制器工厂PluginControllerFactory查找插件控制器。

    7:定义插件开发常用功能,如:URL查找。

    注意:

        插件中的 web.config 文件是为了让 .cshtml 有智能感知提示

        每个插件都需要有一个类(只能有一个)继承LCLPlugin来表示这是一个LCLPlugin

    LCLFramework框架之Plugin开发


    clipboard[9]

    clipboard[10]

    LCLFramework框架之MVC Plugin开发


    clipboard[11]

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

    单机部署:

  • 相关阅读:
    Find the Smallest K Elements in an Array
    Count of Smaller Number
    Number of Inversion Couple
    Delete False Elements
    Sort Array
    Tree Diameter
    Segment Tree Implementation
    Java Programming Mock Tests
    zz Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
    Algorithm about SubArrays & SubStrings
  • 原文地址:https://www.cnblogs.com/luomingui/p/4117558.html
Copyright © 2011-2022 走看看