注意,閱讀本文,需要先閱讀以下兩篇文章,並且對依賴注入有一定的基礎。
模塊系統:http://www.cnblogs.com/mienreal/p/4537522.html
依賴注入:http://www.cnblogs.com/mienreal/p/4550500.html
正文:
我最近在設計一個項目,而這個項目的一些業務功能,需要以插件的方式提供給這個項目,從而降低耦合性,主項目不會對具體業務功能產生依賴。
在以前,最簡單粗暴的方式,就是掃描主程序目錄下的所有dll或指定目錄下的dll,然後反射生成運行時對象。
現在,由於整個項目,采用了依賴注入,包括插件項目也是如此。
雖然經常用ABP開發項目,並且偶爾閱讀ABP相關技術文章,但是卻不知道ABP有提供插件組件。
在不知道ABP插件組件之前,使用依賴注入的情況下,我找不到比較靈活簡潔的方式,為主程序提供插件功能。
很是苦惱,經過一番搜索,找到了ABP官方Github裡的Sample項目:https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/PlugInDemo 才知道有這個插件組件。
有這個插件組件,要做插件式項目開發就容易多了。
我另外寫了個基於ABP的控制台Demo項目,做下備忘吧。
using System; using System.IO; using Abp; using Abp.PlugIns; namespace ConsoleApp { public class Program { private static void Main(string[] args) { Console.WriteLine("Create AbpBootstrapper."); using (var booter = AbpBootstrapper.Create<ConsoleAppModule>()) { var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PlugIns"); Console.WriteLine("path is " + path); booter.PlugInSources.AddFolder(path); Console.WriteLine("Added PlugIns Directory is completed."); booter.Initialize(); Console.WriteLine("Initialize DI is completed."); var test = booter.IocManager.Resolve<TestDI>(); test.Run(); var test2 = booter.IocManager.Resolve<TestDI>(); test2.Run(); } Console.WriteLine("Dispose AbpBootstrapper."); Console.ReadKey(); } } }
插件式開發,有幾個需要注意的地方:
1.在主項目,需要這一句代碼:booter.PlugInSources.AddFolder(path);
通知ABP的Module系統和DI系統,這個目錄下也有dll需要掃描和初始化。
2.每個插件項目,需要添加一個AbpModule派生類。
因為ABP只掃描包含有AbpModule派生類的程序集,所有你需要創建一個AbpModule派生類來告訴ABP,這裡也需要掃描和初始化。
3.每個插件接口/類,需要繼承ISingletonDependency,ITransientDependency等位於Abp.Dependency命令空間下的Dependency接口。
ABP會掃描所有繼承了這些接口的接口/類,自動幫你解決依賴關系,並且創建相關的依賴對象。
一個比較簡單的AbpModule派生類,如下:
using System.Reflection; using Abp.Modules; namespace ConsoleApp.AsynStrategy { public class ConsoleAppAsynStrategyModule : AbpModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } } }
一般情況下,每個AbpModule派生類,都應該用IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());這一句代碼重寫Initalize方法。
項目結構圖:
目錄結構圖:
項目Demo下載:http://files.cnblogs.com/files/VAllen/AbpConsoleAppDemo.7z
或Github:https://github.com/VAllens/AbpConsoleAppDemo.git