插件應用架構概述
基於LCLFramework插件框架的應用由以下三個部分構成:
(1)主程序:針對特定應用環境(Web、WinForm等應用環境),加載啟動插件,獲取插件入口,運行入口程序。
(2)插件:提供應用功能,實現對其它插件功能擴展並暴露功能擴展點。
(3)插件框架:與特定應用環境無關,實現插件功能組合與擴展。
主程序與插件的通訊
主程序可以通過插件框架LEnvironment來注冊和獲取服務。
服務在這里表述為:服務 = 接口/基類 + 實現類。
Plugin模式在示例中的實際目的小結一下
- Plugin模式是架構模式,在設計架構時,才有參考價值;
- Plugin模式主要是實現單一職責的封裝,和擴展應用程序;
- 目前的插件框架主要是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.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開發
![clipboard[9] clipboard[9]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNTQzNDYvMjAxNDEyLzExMDkyMzM0NDQ2Nzk0Mi5wbmc=.png)
LCLFramework框架之MVC Plugin開發
![clipboard[11] clipboard[11]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNTQzNDYvMjAxNDEyLzExMDkyMzM4NjUwMTE2MC5wbmc=.png)
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"/>
單機部署: