BCVP开发者说第4期:Remember.Core
沉靜歲月,淡忘流年
1
項目簡介
Remember.Core
???
一個輕量的 Web 應用框架, 具有優雅、高效、簡潔、富于表達力等優點。采用 前后端分離 設計,是崇尚開發效率的全??蚣?/p>
簡潔友好 - 統一的設計規范,精心打磨的操作界面回應你的期待。
易擴展 - 一套完整的插件機制,以 約定優于配置 為中心的項目結構,無論是對開發者還是使用者都如此友好。
Remember.Core目前僅提供了插件框架,若你需要實現一個Web插件系統,或許 Remember.Core 是不錯的參考,這也是本項目的目的,作為 插件系統實現的參考。
?
原項目地址:
https://github.com/yiyungent/Remember.Core
作者博客:
https://moeci.com/
https://moeci.com/Remember.Core
?2
框架功能
?
在線項目演示:
暫無
(插件列表)
(運行效果)
(插件配置)
(插件文檔說明)
功能一覽
上傳本地插件 - 熱插拔:
無論是加載,卸載都無需重啟你的站點
放置鉤子 - 讓插件行為加入框架
全程依賴注入 - 你可在插件生命周期獲取你注入的任何服務
以約定優于配置為中心的項目結構 - 只需關注你的業務
一插件一LoadContext - 插件間彼此隔離
Framework 域共享機制 - 免去重復加載
簡單易用 - PluginFinder、PluginManager 或許你僅僅需要它們
一套完整的 插件生命周期 - 在需要時做你想做
動態擴展 WebAPI - 每個插件都是一個 WebAPI
完整插件的機制 - 從上傳,設置,禁用再到卸載,一次打通
多數據庫切換 - 讓EF做它該做的事
輕量的插件框架 - 易用不過如此
3
框架技術棧
(系統所用到的技術棧)
前端基于vue-element-admin,后端基于.NETCore3.1,RESTful和SemanticWebAPI 設計,采用UHub(IdentityServer4)完成認證授權。
配合使用Autofac依賴注入容器,
EFCore提供數據持久化ORM,
Serilog做日志集成,
Quartz.NET做任務調度。
核心的還是基于插件可拔插式的開發模式,有很好的借鑒意義。
4
分層介紹
1. 引入插件框架dll(PluginCore 必須,其它根據需要)
一個示例插件項目結構?如下圖
2. 添加 GetUserInfoPlugin 類 繼承 BasePlugin
或則你可以直接實現?IPlugin 可通過預先定義框架行為鉤子,插件再實現接口,將插件行為加入框架,如實現?ITestPlugin 支持插件?構造器注入?框架預先注入的服務等
public class GetUserInfoPlugin : BasePlugin, ITestPlugin {private readonly IUserInfoService _userInfoService;public GetUserInfoPlugin(IUserInfoService userInfoService){this._userInfoService = userInfoService;}public string Say(){UserInfo userInfo = _userInfoService.FirstOrDefaultAsync(m => !m.IsDeleted).Result;string rtn = $"用戶名: {userInfo.UserName}, 創建時間: {userInfo.CreateTime.ToString()}";return rtn;}public override (bool IsSuccess, string Message) AfterEnable(){Console.WriteLine($"{nameof(GetUserInfoPlugin)}: {nameof(AfterEnable)}");return base.AfterEnable();}public override (bool IsSuccess, string Message) BeforeDisable(){Console.WriteLine($"{nameof(GetUserInfoPlugin)}: {nameof(BeforeDisable)}");return base.BeforeDisable();} }3. 插件其他配置
支持 動態擴展 WebAPI,和普通WebAPI 項目相同,直接創建 Controller 即可
[Route("api/plugins/[controller]")] [ApiController] public class UserHelloController : ControllerBase {private readonly IUserInfoService _userInfoService;public UserHelloController(IUserInfoService userInfoService){this._userInfoService = userInfoService;}public ActionResult Get(){UserInfo userInfo = _userInfoService.FirstOrDefaultAsync(m => !m.IsDeleted).Result;SettingsModel settingsModel = PluginSettingsModelFactory.Create<SettingsModel>("GetUserInfo");string rtn = $"用戶名: {userInfo.UserName}, 創建時間: {userInfo.CreateTime.ToString()}, Hello: {settingsModel.Hello}";return Ok(rtn);} }4. 插件發布打包
右鍵選擇插件項目,點擊發布(Publish),再將發布后的插件文件夾打包為?GetUserInfo.zip?即可 ????壓縮包名可隨意,框架將以?info.json?中?PluginId?作為插件標識 ????打包后的插件,即可通過?上傳本地插件?載入框架 ?? GetUserInfo.csproj?參考
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework></PropertyGroup><ItemGroup><ProjectReference Include="..\..\src\Framework\Libraries\Domain\Domain.csproj" /><ProjectReference Include="..\..\src\Framework\Libraries\Framework\Framework.csproj" /><ProjectReference Include="..\..\src\Framework\Libraries\PluginCore\PluginCore.csproj" /><ProjectReference Include="..\..\src\Framework\Libraries\Services\Services.csproj" /></ItemGroup><ItemGroup><None Update="info.json"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None><None Update="README.md"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None><None Update="settings.json"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None></ItemGroup></Project>本框架主要提供了插件框架的簡單實現樣板,如果你想要實現一個Web插件框架,你可以參考本框架的代碼。
基于Net/Core,快速搭建 API & SPA 及微服務應用組織
BASE NETCORE (VUE) PROJECT TEAM
每一個.NET開發者都可以通過自己的開源項目(最好可以配套簡單發表些文章)在這里進行分享,BCVP開發者組織的意義就是激發和挖掘更多的作品,可能偏基礎,但是都會有價值。目的就是希望:每個人能將從社區學到的知識,進行自己消化和總結,濃縮成一個個獨立的項目,接著投入到社區,最后讓更多的初學者去了解、去學習、去思想碰撞,從而達到學習來源于社區,最后反哺于社區的良好循環目的,我們都是學生,也都是下一批初學者的老師,這才應該是一個社區正向推動的方法。
地址:
https://github.com/BaseCoreVueProject
可以在Home倉庫里,查看具體的流程說明,只要你愿意分享,就來吧。
加入我們
總結
以上是生活随笔為你收集整理的BCVP开发者说第4期:Remember.Core的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个情怀引发的生产事故(续)
- 下一篇: 如何在 C# 中使用 AutoMappe