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

一、前言

在2.0的架构设计中,引入了插件的概念,目的就是为了解决代码臃肿问题,随着系统功能越来越多,System层的代码也越来越多,之前是以文件夹的方式区分功能模块,这样的话代码就过于集中,想找到某一个功能模块的代码就要翻好几个文件夹,不利于以后的开发和维护。所以在新的架构中,我将部分功能模块通过插件的方式提取出来,封装成类库形式的插件,这样System层如果需要哪个功能,就直接引用该功能模块的插件,我们调试代码中遇到问题也直接可以去对应功能模块的插件项目中查看代码并调试,非常方便。

二、如何新建插件

新建类库项目,输入项目名称和项目位置,命名规则为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插件和SimpleAdmin.Sqlsugar层。

创建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;

创建配置文件,xx.Development.json和xx.Production.json,记得设置文件属性为较新时复制

新建Options文件添加配置转实体类、继承BaseOptions, IConfigurableOptions

新建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)
    {
        var fullName = Assembly.GetExecutingAssembly().FullName;//获取程序集全名
        //通过 App.GetOptions<TOptions> 获取选项
        var settings = App.GetOptions<TestSettingsOptions>();
        CodeFirstUtils.CodeFirst(settings, fullName);//CodeFirst
    }
}

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

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

posted @ 2023-04-06 20:48  HuTiger  阅读(1925)  评论(0编辑  收藏  举报