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

單機部署:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM