精簡ABP的模組依賴

微笑刺客D發表於2021-08-19

ABP的模組非常方便我們擴充套件自己的或使用ABP提供的模組功能,對於ABP自身提供的模組間的依賴關係想一探究竟,並且試著把不必要的模組拆掉,找到那部分核心模組。本次使用的是AspNetBoilerplate

原始碼下載

從Github下載ABP原始碼後,進入src資料夾,提供的大部分模組都在此中。很多工具也經ABP封裝,個人認為是方便了整合使用且融入到ABP這個框架。

圖片

src資料夾中的類庫有幾種型別如.net standard(為了相容.net framework)、.net 5 、.net framework的。

我的想法是最小的模組引用,因此按照如下兩個條件移除

  • 移除.net framework的,只專注於.net core所需要的。
  • 移除Zero模組。

精簡模組

整理後也就是剩下這部分,這樣看仍然感覺有很多模組,但對於其中大部分來講更多的是將一些工具封裝了下,比如從SignalR,AutoMapper,Log4Net,Dapper,EFCore等等。

圖片

通過整理這部分類庫間的依賴關係,(此圖中去掉了Dapper、NHibernate、MemoryDB和MongoDb),如此一來分類便清晰許多,一眼便可以識別出Abp這一核心模組。哪些模組的提供的功能是什麼,這樣也方便檢視。

圖片

我們再來建立一個專案來直接對該部分類庫引用,而不是走Nuget包的方式。先依賴需要的最基本的模組,比如Abp、Abp.WebCommon和Abp.AspNetCore等幾個模組,能夠保障最基本的請求功能,甚至於讀取資料庫的ORM工具都不納入進來。

圖片

依賴核心模組

此處將Log4Net作為需要的模組納入進來,因為Abp中部分地方記錄日誌時候需要相應的實現類,當然也可以使用其他日誌元件如NLog等,但需要實現Abp中封裝好的抽象類,可參考如下連結:https://www.cnblogs.com/donaldtdz/p/8213440.html

新建一個空白解決方案AbpIntegrationDemo.sln

  • 建立一個module資料夾用於放置上述最基本模組。
  • 建立一個src資料夾中用於搭建分層結構。

圖片

對於src中的每一層所依賴的專案按照層次關係及依賴關係,其中核心層Domain依賴Abp模組,Application和Infrastructure都依賴核心層也就都對Abp模組有了依賴關係了。

圖片

如此一來,最為基本的依賴便完成了,各層內增加相應的Module,按照Abp模組化構建方式將這些模組貫穿起來。比如AbpIntegrationDemo.Admin,將依賴的模組,需要注入的、配置的東西加入進來,此處部分直接從Abp start up中搬過來的,還可以再精簡一下,部分內容目前是沒有用到的。

[DependsOn(
    typeof(AbpIntegrationApplicationModule),
    typeof(AbpIntegrationInfrastructureModule),
    typeof(AbpAspNetCoreModule)
    )]
public class AbpIntegrationAdminModule : AbpModule
{
    private readonly IWebHostEnvironment _env;
    private readonly IConfiguration _appConfiguration;

    public AbpIntegrationAdminModule(IWebHostEnvironment env, IConfiguration appConfiguration)
    {
        _env = env;
        _appConfiguration = appConfiguration;
    }

    public override void PreInitialize()
    {
        Configuration.DefaultNameOrConnectionString = _appConfiguration.GetConnectionString(AbpIntegrationDomainConsts.ConnectionStringName);
        Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = false;
    }

    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(typeof(AbpIntegrationAdminModule).GetAssembly());
    }

    public override void PostInitialize()
    {
        IocManager.Resolve<applicationpartmanager>()
            .AddApplicationPartsIfNotAddedBefore(typeof(AbpIntegrationAdminModule).Assembly);
    }

    public override void Shutdown()
    {
        base.Shutdown();
    }
}

在此基礎上,按照需要的模組,如EF Core、Redis、Hangfire、AutoMapper等等,也只需要引用進來了,至少到現有地步,對於Abp模組的依賴及最為核心的模組應該是清楚了,而對於看到很多人說Abp重的說法,個人感覺是不是看到依賴的模組太多而有種複雜的感覺,實則有很多是工具模組,即使不使用Abp,實際開發中也會使用進來。
https://gitee.com/530521314/Partner.TreasureChest/tree/master/AbpIntegrateDemo

2021-08-19,望技術有成後能回來看見自己的腳步

相關文章