基於ABP模塊組件與依賴注入組件的項目插件開發


注意,閱讀本文,需要先閱讀以下兩篇文章,並且對依賴注入有一定的基礎。

模塊系統: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


免責聲明!

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



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