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

发布时间 2023-04-06 20:53:13作者: HuTiger

一、前言

在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层引用才行。

启动项目,可以看到插件启动了,剩下的就是自己写插件功能了。