草庐IT

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

少林寺驻武当上办事处大神父王喇嘛的博客 2023-04-21 原文

一、前言

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

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

有关SimpleAdmin手摸手教学之:插件管理的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  4. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  7. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  8. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  9. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  10. ruby - vagrant 从 github 安装插件 - 2

    我们正在使用Vagrant进行部署,我们最终希望将此集群部署在Rackspace上。vagrant-rackspace插件是一个自然的选择,但它有一些错误,这些错误未包含在最新的0.1.1版本中(notablythatvagrantprovisiondoesn'twork)。我已经在我的personalfork中解决了这个问题通过合并其他人的工作来对存储库进行改造。是否可以从github安装vagrant插件?显而易见的事情没有奏效:[unix]$vagrantplugininstallvagrant-rackspace--plugin-sourcehttps://github.com

随机推荐