LCLFramework框架之Plugin模式

插件應用架構概述 html


基於LCLFramework插件框架的應用由如下三個部分構成: web

(1)主程序:針對特定應用環境(Web、WinForm等應用環境),加載啓動插件,獲取插件入口,運行入口程序。 架構

(2)插件:提供應用功能,實現對其它插件功能擴展並暴露功能擴展點。 mvc

(3)插件框架:與特定應用環境無關,實現插件功能組合與擴展。 app

clipboard[6]

主程序與插件的通信 框架


clipboard[7]

      主程序能夠經過插件框架LEnvironment來註冊和獲取服務。 ide

服務在這裏表述爲:服務 = 接口/基類 + 實現類。 函數

 

Plugin模式在示例中的實際目的小結一下 網站


  1. Plugin模式是架構模式,在設計架構時,纔有參考價值;
  2. Plugin模式主要是實現單一職責的封裝,和擴展應用程序;
  3. 目前的插件框架主要是Kernel+Core Plugins組成的結構體系;

Plugin與擴展的區別 ui


      插件稍不一樣於擴展(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"/>

單機部署:

相關文章
相關標籤/搜索