SimpleAdmin手摸手教學之:插件管理

一、前言

在2.0的架構設計中,引入了插件的概念,目的就是爲了解決代碼臃腫問題,隨着系統功能越來越多,System層的代碼也越來越多,之前是以文件夾的方式區分功能模塊,這樣的話代碼就過於集中,想找到某一個功能模塊的代碼就要翻好幾個文件夾,不利於以後的開發和維護。所以在新的架構中,我將部分功能模塊通過插件的方式提取出來,封裝成類庫形式的插件,這樣System層如果需要哪個功能,就直接引用該功能模塊的插件,我們調試代碼中遇到問題也直接可以去對應功能模塊的插件項目中查看代碼並調試,非常方便。

二、插件說明

2.1核心插件

2.1.1 SimpleAdmin.Plugin.Core

插件核心,被其他插件所引用,類似SimplAdmin.Core層,存放一些公共的特性,常量,枚舉,接口等。

2.1.2 SimpleAdmin.Plugin.SqlSugar

SqlSugar插件,集成了SqlSugar的單例模式,數據庫實體和一些常量我也移了過來,之前是放在覈心層,但是我覺得提取出來的話後面找數據庫相關的功能和配置就直接到SqlSugar插件找,非常方便。

2.1.3 SimpleAdmin.Plugin.CodeFirst

CodeFirst數據遷移插件,如果需要數據庫初始化和種子數據的生成,則引用該插件。

2.1.4 SimpleAdmin.Plugin.Cache

緩存插件,支持MemeryCache和Redis二選一,默認使用MemeryCache。

2.1.5 SimpleAdmin.Plugin.Aop

Aop插件,如果需要Aop功能,則可以使用該插件。

2.2系統模塊

2.2.1 SimpleAdmin.Plugin.Mqtt

Mqtt插件,集成mqtt客戶端功能,如果需要使用mqtt功能則可以引用該插件,支持和SignalR插件並存。

2.2.2 SimpleAdmin.Plugin.SignalR

SignalR插件,主要用於及時通訊和消息通知,系統默認消息通知使用的是Signalr,當然也可以切換成mqtt,可以和mqtt插件並存。

2.2.3 SimpleAdmin.Plugin.ImportExport  

導入導出插件,繼承了數據導入導出功能,使用的Magicodes.IE.Excel實現的

2.2.4 SimpleAdmin.Plugin.Gen

代碼生成插件,集成了代碼生成器功能,跟其他插件不同的是該插件引用System層而不是被System層引用。

2.2.5 SimpleAdmin.Plugin.Batch

批量編輯插件,集成了批量編輯功能。

三、如何新建插件

新建類庫項目,輸入項目名稱和項目位置,命名規則爲SimpleAdmin.Plugin.XXX,注意項目位置要在SimpleAdmin.Plugin文件夾。

雙擊新建的插件,修改PropertyGroup裏得內容,這裏的DocumentationFile改成自己的插件名稱。

	<PropertyGroup>
		<TargetFrameworks>net7.0;net6.0</TargetFrameworks>
		<NoWarn>1701;1702;8616;1591;8618;8629;8602;8603;8604;8625;8765</NoWarn>
		<DocumentationFile>SimpleAdmin.Plugin.Test.xml</DocumentationFile>
		<ImplicitUsings>enable</ImplicitUsings>
		<Nullable>enable</Nullable>
	</PropertyGroup>

vs應該會提示重新加載項目,選擇重新加載項目,並引用SimpleAdmin.Plugin.Core插件。

創建GlobalUsing.cs文件,用於全局引用。

global using Furion;
global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.Extensions.DependencyInjection;
global using SimpleAdmin.Plugin.Core;

新建startup.cs類,在 Furion 框架中,提供了更爲靈活的 Startup 類配置方式,無需在 Web 啓用層 中配置,可將配置放到任何項目層。詳情可以查看Furion文檔 https://furion.baiqian.ltd/docs/appstartup

/// <summary>
/// AppStartup啓動類
/// </summary>
public class Startup : AppStartup
{
    /// <summary>
    /// ConfigureServices中不能解析服務,比如App.GetService(),尤其是不能在ConfigureServices中獲取諸如緩存等數據進行初始化,應該在Configure中進行
    /// 服務都還沒初始化完成,會導致內存中存在多份 IOC 容器!!
    /// 正確應該在 Configure 中,這個時候服務(IServiceCollection 已經完成 BuildServiceProvider() 操作了
    /// </summary>
    /// <param name="services"></param>
    public void ConfigureServices(IServiceCollection services)
    {
         Console.WriteLine("註冊Test插件");
         //serviec.AddXXX();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

 通過startup的方式,你只要引用了插件,則系統啓動之後會自動調用裏面的ConfigureServicesConfigure。如果你想你的插件可以通過配置文件選擇啓用或者不啓用,那麼你應該創建一個Component類,可以參考MQTT組件和Furion文檔https://furion.baiqian.ltd/docs/component

namespace SimpleAdmin.Plugin.Test;

/// <summary>
///  Test組件
/// </summary>
public sealed class TestComponent : IServiceComponent
{

    /// <summary>
    /// ConfigureServices中不能解析服務,比如App.GetService(),尤其是不能在ConfigureServices中獲取諸如緩存等數據進行初始化,應該在Configure中進行
    /// 服務都還沒初始化完成,會導致內存中存在多份 IOC 容器!!
    /// 正確應該在 Configure 中,這個時候服務(IServiceCollection 已經完成 BuildServiceProvider() 操作了
    /// </summary>
    /// <param name="services"></param>
    public void Load(IServiceCollection services, ComponentContext componentContext)
    {
        Console.WriteLine("註冊Test插件");
    }
}


/// <summary>
/// Test組件
/// 模擬 Configure
/// </summary>
public sealed class TestApplicationComponent : IApplicationComponent
{
    public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext)
    {

    }
}

System層引用新建的插件,如果你的插件是像代碼生成插件一樣引用了System層,則要Web.Core層引用纔行。

啓動項目,可以看到插件啓動了,剩下的就是自己寫插件功能了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章