Skip to content

🔌 ASP.NET Core lightweight plugin framework | ASP.NET Core 轻量级 插件框架 - 一分钟集成 | Vue.js frontend | JavaScript SDK

License

Notifications You must be signed in to change notification settings

yiyungent/PluginCore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PluginCore

PluginCore

English | 中文

🔌 ASP.NET Core lightweight plugin framework | ASP.NET Core 轻量级 插件框架 - 一分钟集成 | Vue.js frontend | JavaScript SDK

repo size LICENSE CodeFactor downloads QQ Group Telegram Group

CLA assistant FOSSA Status Ask DeepWiki

Introduce

🔌 ASP.NET Core lightweight plugin framework | ASP.NET Core 轻量级 插件框架 - 一分钟集成 | Vue.js frontend | JavaScript SDK

  • Simple - Agreement is better than configuration, with minimal configuration to help you focus on your business
  • Out of the box - Automatic front-end and back-end integration, two lines of code complete the integration
  • Dynamic WebAPI - Each plug-in can add a Controller and have its own routing
  • Plugin isolation and sharing - Perfect plugin isolation and type sharing
  • Front and back ends of the plug-in are separated - You can place the front-end files (index.html,...) under the plugin wwwroot folder, and then visit /plugins/pluginId/index.html
  • Hot swap - Upload, install, enable, disable, uninstall, and delete without restarting the site; you can even add the HTTP request pipeline middleware at runtime through the plug-in, and there is no need to restart the site
  • Dependency injection - You can apply for dependency injection in the construction method of the plug-in class that implements IPlugin. Of course, dependency injection can also be used in the controller construction method
  • Modular - Process modularization, full dependency injection, can be implemented by replacement to customize the plug-in mechanism
  • Easy to expand - You can write your own plug-in SDK, then reference the plug-in SDK, write extension plug-ins-custom plug-in hooks, and apply
  • Plugin dependency tree - Declarative dependencies, automatically establish the correct loading order according to the dependencies between plugins
  • Life cycle - Controllable plug-in life cycle, perfect event distribution
  • Widget - You can bury extension points in the front end, inject widgets through plug-ins, widgets have perfect HTML/CSS/JavaScript support, and elegant event dispatch
  • No database required - No database dependency
  • 0 intrusion - Nearly zero intrusion, does not affect your existing system
  • Little reliance - Only rely on a third-party package (SharpZipLib for decompression)
  • Globalization - Thanks to the internationalization implementation of i18n, it provides multi-language switching support

Online demo

Tech Stack

  • Backend: .NET/C#: .NET Standard & .NET Core & .NET & ASP.NET Core
  • Frontend: Vue.js & vue-i18n & Vue Router & Vuex & Element UI
  • Frontend: babel & mockjs & sass & autoprefixer & eslint & axios & npm

Related Online Products:

  • https://120365.xyz
    • Online Tools Collection
    • Data Analysis Visualization
    • Time Management
    • Efficiency Toolbox

Screenshot

One minute integration

Recommended Use NuGet, Execute the following commands in the root directory of your project. If you use Visual Studio, then click Tools -> NuGet Package Manager -> Package Manager Console, make sure "Default project" It is the item you want to install, enter the command below to install it.

ASP.NET Core Project

PM> Install-Package PluginCore.AspNetCore

Modify the code in your ASP.NET Core application

Startup.cs

using PluginCore.AspNetCore.Extensions;

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    // 1. Add PluginCore
    services.AddPluginCore();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    // 2. Use PluginCore
    app.UsePluginCore();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Now visit https://localhost:5001/PluginCore/Admin to enter PluginCore Admin https://localhost:5001 Need to be changed to your address

Notice

Please log in to PluginCore Admin, and for safety, modify the default user name and password in time:

App_Data/PluginCore.Config.json

{
	"Admin": {
		"UserName": "admin",
		"Password": "ABC12345"
	},
	"FrontendMode": "LocalEmbedded",
	"RemoteFrontend": "https://cdn.jsdelivr.net/gh/yiyungent/plugincore-admin-frontend@0.1.2/dist-cdn"
}

After the modification, it will take effect immediately, no need to restart the site, you need to log in to PluginCore Admin again

Docker experience

If you need to experience PluginCore locally, then here is an example(/examples)

docker run -d -p 5004:80 -e ASPNETCORE_URLS="http://*:80" --name plugincore-aspnetcore3-1 yiyungent/plugincore-aspnetcore3-1

Now you can visit http://localhost:5004/PluginCore/Admin

add:
If you use Docker Compose, you can refer to docker-compose.yml in the root directory of the warehouse

add:
Use ghcr.io

docker run -d -p 5004:80 -e ASPNETCORE_URLS="http://*:80" --name plugincore-aspnetcore3-1 ghcr.io/yiyungent/plugincore-aspnetcore3-1

Use

Add plugin hook and apply

  1. For example, custom plug-in hook: ITestPlugin
using PluginCore.IPlugins;

namespace PluginCore.IPlugins
{
    public interface ITestPlugin : IPlugin
    {
        string Say();
    }
}
  1. Apply the hook where it needs to be activated, so that all enabled plug-ins that implement ITestPlugin will call Say()
using PluginCore;
using PluginCore.IPlugins;

namespace WebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private readonly PluginFinder _pluginFinder;

        public TestController(PluginFinder pluginFinder)
        {
            _pluginFinder = pluginFinder;
        }

        public ActionResult Get()
        {
            //var plugins = PluginFinder.EnablePlugins<BasePlugin>().ToList();
            // All enabled plugins that implement ITestPlugin
            var plugins2 = _pluginFinder.EnablePlugins<ITestPlugin>().ToList();

            foreach (var item in plugins2)
            {
                // transfer
                string words = item.Say();
                Console.WriteLine(words);
            }

            return Ok("");
        }
    }
}

Custom frontend

PluginCore supports 3 front-end file loading methods

FrontendMode in the configuration file App_Data/PluginCore.Config.json

  1. LocalEmbedded
  • By default, embedded resources and front-end files are packaged into dll. In this mode, it is not easy to customize the front-end files. You need to modify the source code of PluginCore and recompile. It is not recommended
  1. LocalFolder
  • In the ASP.NET Core project that integrates PluginCore, create a new PluginCoreAdmin, and put the front-end files into this folder
  1. RemoteCDN
  • To use remote CDN resources, you can specify the url through the RemoteFrontend in the configuration file

Note:
After updating FrontendMode, the site needs to be restarted for the changes to take effect

Additional Information

Additional Information

To develop plugins, you only need to add a reference to the PluginCore.IPlugins package (plugin SDK),

Of course, if you need PluginCore, you can also add a reference

Specifications

  1. Plugin SDK

Plugin interfaces should be located in the PluginCore.IPlugins namespace. This is a convention, not mandatory, but it is recommended to do so,

The assembly name does not have to be the same as the namespace name. You can completely use the PluginCore.IPlugins namespace in your plugin SDK assembly.

  1. Plugin

The plugin assembly name (usually = project name) must match the PluginId in the plugin info.json, for example: Project: HelloWorldPlugin, PluginId: HelloWorldPlugin. This is required, otherwise the plugin cannot be loaded PluginId is the unique identifier of the plugin

Version dependency

Since PluginCore.IPlugins-v0.8.0, the PluginCore project has been refactored. PluginCore only contains core plugin logic, and ASP.NET Core needs to use PluginCore.AspNetCore

PluginCore.IPlugins 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.8.0 0.9.0 0.9.0 0.9.0 0.9.0 0.9.1 0.9.1 0.9.1
PluginCore 1.0.0 1.0.0 1.0.0 1.0.0 2.0.0 2.0.0 2.0.1 2.0.1 2.0.1 2.0.2 2.0.2 2.1.0 2.2.0 2.2.1 2.2.2 2.2.2 2.2.3 2.2.3 2.2.4
PluginCore.IPlugins.AspNetCore 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.0.1 0.1.0 0.1.0 0.1.0 0.1.0 0.1.1 0.1.1 0.1.1
PluginCore.AspNetCore 0.0.2 0.0.3 0.0.4 0.0.5 0.0.5 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.1.0 1.2.0 1.3.1 1.3.2 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1
plugincore-admin-frontend 0.1.0 - 0.3.1 0.1.0 - 0.3.1 0.1.0 - 0.3.1 0.1.0 - 0.3.1 0.1.0 - 0.3.1 0.1.0 - 0.3.1 0.1.0 - 0.3.1 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2 0.3.2
plugincore-js-sdk 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0 0.1.0 - 0.5.0

Below are the old version dependencies, for archival purposes only

PluginCore.IPlugins 0.1.0 0.1.0 0.2.0 0.2.0 0.2.0 0.3.0 0.3.0 0.4.0 0.5.0 0.6.0 0.6.0 0.6.0 0.6.0 0.6.1 0.6.1 0.6.1 0.7.0 0.7.0 0.7.0 0.7.0
PluginCore 0.1.0 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 0.5.1 0.6.0 0.7.0 0.8.0 0.8.1 0.8.2 0.8.3 0.8.4 0.8.5 0.8.6 0.9.0 0.9.1 0.9.2 0.9.3
plugincore-admin-frontend 0.1.0 0.1.2 0.1.2 0.1.3 0.1.3 0.2.0 0.2.0 0.2.0 0.2.0 0.2.0 0.2.3 0.2.3 0.2.3 0.2.3 0.3.0 0.3.0 0.3.0 0.3.0 0.3.0 0.3.1
plugincore-js-sdk - - - - - - - - - - - - - - - - 0.1.0 0.1.0 0.1.0 0.1.0
PluginCore.IPlugins nuget downloads
PluginCore nuget downloads
PluginCore.IPlugins.AspNetCore nuget downloads
PluginCore.AspNetCore nuget downloads
PluginCore.Template nuget downloads
plugincore-admin-frontend NPM version NPM downloads
plugincore-js-sdk NPM version NPM downloads

Project structure

graph BT
    iplugins_aspnetcore(PluginCore.IPlugins.AspNetCore) --> iplugins(PluginCore.IPlugins)
    aspnetcore(PluginCore.AspNetCore) --> iplugins_aspnetcore
    plugincore(PluginCore) --> iplugins
    aspnetcore(PluginCore.AspNetCore) --> plugincore
    admin_frontend(plugincore-admin-frontend) --> aspnetcore
    jssdk(plugincore-js-sdk) --> aspnetcore
Loading

Environment

  • Runtime: .NET Core 3.1 (+)
  • Development: Visual Studio Community 2019

Related Projects

Components of This Project

Predecessors/Related Projects

Projects Using This Project

  • yiyungent/KnifeHub - 【PluginCore.AspNetCore Best Practice】Tool Platform | Daily Life/Learning/Work/Development Tool Collection
  • yiyungent/Dragonfly - ASP.NET Core + Selenium Web Automation Implementation

Acknowledgments

  • Plugin system design referenced from CoolCat, thanks to author lamondlu for the contribution
  • Design referenced from nopCommerce, thanks to author nopSolutions for the contribution

Special Thanks

This project has joined the zmto & JetBrains & Netlify Open Source Program.

Special thanks to ZMTO for sponsoring servers for this project for testing purposes.

Special thanks to JetBrains for providing free licenses of ReSharper and more for open-source projects.

Special thanks to Netlify for supporting open-source projects.

Sponsors

This list is automatically updated by afdian-action

Thanks to these sponsors from Afdian:

爱发电用户_e98fe RemMai 浮沉 WiMi Dr MonoLogueChi
点我 打开/关闭 赞助者列表 爱发电用户_e98fe ( 1 次赞助, 共 ¥30 ) 留言:
RemMai ( 1 次赞助, 共 ¥15 ) 留言: 感谢提供插件灵感。 ...
浮沉 ( 1 次赞助, 共 ¥100 ) 留言:
WiMi ( 1 次赞助, 共 ¥30 ) 留言: 感谢分享
Dr ( 1 次赞助, 共 ¥10 ) 留言: 非常感谢
MonoLogueChi ( 1 次赞助, 共 ¥28.2 ) 留言: 感谢你的开源项目

Donate

PluginCore is an GNU LGPLv3 licensed open source project and completely free to use. However, the amount of effort needed to maintain and develop new features for the project is not sustainable without proper financial backing.

We accept donations through these channels:

License

FOSSA Status

Author

PluginCore © yiyun, Released under the GNU LGPLv3 License.
Authored and maintained by yiyun with help from contributors (list).

GitHub @yiyungent Gitee @yiyungent

About

🔌 ASP.NET Core lightweight plugin framework | ASP.NET Core 轻量级 插件框架 - 一分钟集成 | Vue.js frontend | JavaScript SDK

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

Packages

 
 
 

Contributors 4

  •  
  •  
  •  
  •