插件應用架構概述 html
基於LCLFramework插件框架的應用由如下三個部分構成: web
(1)主程序:針對特定應用環境(Web、WinForm等應用環境),加載啓動插件,獲取插件入口,運行入口程序。 架構
(2)插件:提供應用功能,實現對其它插件功能擴展並暴露功能擴展點。 mvc
(3)插件框架:與特定應用環境無關,實現插件功能組合與擴展。 app
主程序與插件的通信 框架
主程序能夠經過插件框架LEnvironment來註冊和獲取服務。 ide
服務在這裏表述爲:服務 = 接口/基類 + 實現類。 函數
Plugin模式在示例中的實際目的小結一下 網站
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.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"/>
單機部署: