BCVP开发者说第4期:Remember.Core

沉静岁月,淡忘流年

1

项目简介

Remember.Core


   

一个轻量的 Web 应用框架, 具有优雅、高效、简洁、富于表达力等优点。采用 前后端分离 设计,是崇尚开发效率的全栈框架

  • 简洁友好 - 统一的设计规范,精心打磨的操作界面回应你的期待。

  • 易扩展 - 一套完整的插件机制,以 约定优于配置 为中心的项目结构,无论是对开发者还是使用者都如此友好。

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仓库里,查看具体的流程说明,只要你愿意分享,就来吧。

加入我们

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++的assert函数

assert宏的原型定义在<assert.h>中&#xff0c;其作用是如果它的条件返回错误&#xff0c;则终止程序执行&#xff0c;原型定义&#xff1a; #include <assert.h> void assert( int expression ); assert的作用是现计算表达式 expression &#xff0c;如果其值为假…

c++十进制转二进制_二进制与十进制如何互相转换?

正整数的十进制转换二进制将一个十进制数除以二&#xff0c;得到的商再除以二&#xff0c;依此类推直到商等于一或零时为止&#xff0c;倒取除得的余数&#xff0c;即换算为二进制数的结果。只需记住要点&#xff1a;除二取余&#xff0c;倒序排列。由于计算机内部表示数的字节…

如何在 C# 中使用 AutoMapper

译文链接&#xff1a;https://www.infoworld.com/article/3192900/how-to-work-with-automapper-in-csharp.htmlAutoMapper 是一个非常流行的 object-to-object 映射库&#xff0c;它的目的就是帮助你实现不同类型对象之间的映射&#xff0c;举一个例子&#xff0c;在 DDD 开发…

c++STL的反向迭代器

反向迭代器 反向迭代器是一种反向遍历容器的迭代器。也就是&#xff0c;从最后一个元素到第一个元素遍历容器。反向迭代器将自增&#xff08;和自减&#xff09;的含义反过来了&#xff1a;对于反向迭代 器&#xff0c; 运算将访问前一个元素&#xff0c;而 – 运算则访问下一…

matlab eval函数_matlab自动给变量命名

在某些特定场景中&#xff0c;我们需要在一个循环中生成一系列的数据&#xff0c;并把这些数据保存到特定的变量中&#xff0c;这个时候我们就需要实现自动给变量命名&#xff0c;同时赋给变量数值。下面提供2种方法。方法1通过eval函数实现&#xff0c;举个例子clear%%%%%%%%%…

c++的STL中的map(哈希表)与unordered_map

map: unordered_map: map&#xff1a; map内部实现了一个红黑树&#xff0c;该结构具有自动排序的功能&#xff0c;因此map内部的所有元素都是有序的 unordered_map:unordered_map内部实现了一个哈希表&#xff0c;因此其元素的排列顺序是杂乱的&#xff0c;无序的 Map是STL的…

java转python推荐算法_java和python实现一个加权SlopeOne推荐算法

1 importjava.util.HashMap;2 importjava.util.Map;3 importjava.util.List;4 importjava.util.ArrayList;5 importjava.util.Comparator;6 importjava.util.Collections;7 8 /** 9 * Created by on 2016/12/8.ShiYan10 * 一.计算所有物品对的偏差11 * 二.利用偏差进行预测12 *…

IdentityServer4系列 | 简化模式

一、前言从上一篇关于资源密码凭证模式中&#xff0c;通过使用client_id和client_secret以及用户名密码通过应用Client(客户端)直接获取&#xff0c;从而请求获取受保护的资源&#xff0c;但是这种方式存在client可能存了用户密码这不安全性问题&#xff0c;所以需要做到client…

char截取字符串_字符串的排列(滑动窗口)

题目&#xff1a;给定两个字符串 s1 和 s2&#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。换句话说&#xff0c;第一个字符串的排列之一是第二个字符串的子串。示例1&#xff1a;输入: s1 "ab" s2 "eidbaooo"输出: True解释: s2 包含 s1 的排列之…

c++中的全排列函数next_permutation()

全排列函数next_permutation() prev_permutation函数&#xff08;按降序排序&#xff09; 计算序列全排列的函数&#xff1a;next_permutation&#xff08;start,end&#xff09;&#xff0c;此函数求的是当前排列的下一个排列&#xff0c;这里的“下一个”&#xff0c;我们可…

学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片

第一部分&#xff1a;Consul 基础1&#xff0c;Consul 介绍官网文档描述&#xff1a;Consul 是一个网络工具&#xff0c;提供功能齐全的服务网格和服务发现。它可以做什么&#xff1a;自动化网络配置&#xff0c;发现服务并启用跨任何云或运行时的安全连接。那么&#xff0c;我…

python能做哪些客户端_Python 实现简单的客户端认证

问题 你想在分布式系统中实现一个简单的客户端连接认证功能&#xff0c;又不想像SSL那样的复杂。 解决方案 可以利用 hmac 模块实现一个连接握手&#xff0c;从而实现一个简单而高效的认证过程。下面是代码示例&#xff1a; import hmac import os def client_authenticate(con…

多线程并发如何高效实现生产者/消费者?

【导读】无需引入第三方消息队列组件&#xff0c;我们如何利用内置C#语法高效实现生产者/消费者对数据进行处理呢&#xff1f;在.NET Core共享框架&#xff08;Share Framework&#xff09;引入了通道&#xff08;Channel&#xff09;&#xff0c;也就是说无需额外通过NuGet包安…

c++牛客网面试题05. 替换空格

class Solution{public:string replaceSpace(string s){int count0,len s.size();//统计空格的个数for(char c : s){if(c )count;} s.resize(len 2 * count);//修改字符串的长度for(int i len-1, j s.size()-1;i<j;i--,j--) {if(s[i]! )s[j]s[i];else{s[j]0;s[j-1]2;s[j-…

js-cookie 无法设置cookie_php操作 cookie

1&#xff0c;设置cookie<?phpsetcookie(key);setcookie(key1,value1);setcookie(key2,value2,time()1*24*60*60);setcookie(key4, value4, time() 1 * 24 * 60 * 60, , , false, true); //一旦cookie的httponly为真&#xff0c;那么只能在服务端获取&#xff0c;js无法操…

.Net orm 开源项目 FreeSql 2.0.0

写在开头2018年11月头脑发热到今天&#xff0c;一晃已经两年&#xff0c;当初从舒服区走向一个巨大的坑&#xff0c;回头一看后背一凉。两年时间从无到有&#xff0c;经历数不清的日夜奋斗&#xff08;有人问花了多长时间投入&#xff0c;答案&#xff1a;全职x2 两年无休息&a…

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符 头文件&#xff1a;#inlude <ctype.h> spunct() 函数用来检测一个字符是否为标点符号或特殊字符&#xff0c;其原型为&#xff1a; int ispunct(int c); 【参数】c 为需要检测的字符。 【返回值】若 c 为标…

js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化

文章来自&#xff1a;华为云开发者社区摘要&#xff1a;本文主要讲谈及浏览器的渲染原理、流程以及相关的性能问题。问题前瞻1. 为什么css需要放在头部&#xff1f;2. js为什么要放在body后面&#xff1f;3. 图片的加载和渲染会阻塞页面DOM构建吗&#xff1f;4. dom解析完才出现…

做架构也得讲武德

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「169」篇原创敬上大家好&#xff0c;我是Z哥。今天分享一篇对「架构」这件事的随想。我想&#xff0c;做「架构」是每个热爱技术的技术人在不断追求想进入的领域。…

c++随机数函数rand()

c 语言rand()生成随机数 c语言中rand()函数生成随机数的用法&#xff1a; 详细介绍&#xff1a; (1)使用该函数首先应在开头包含头文件stdlib.h #include<stdlib.h>(C建议使用#include&#xff0c;下同) (2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数…