程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 基於ABP模塊組件與依賴注入組件的項目插件開發,abp模塊

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

編輯:C#入門知識

基於ABP模塊組件與依賴注入組件的項目插件開發,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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved