初识ABP vNext(8):ABP特征管理

点击上方蓝字"小黑在哪里"关注我吧

  • 定义特征

  • 应用特征

    • 用户数量

    • 社交登录

前言

上一篇提到了ABP功能管理(特征管理),它来自ABP的FeatureManagement模块,ABP官方文档貌似还没有这个模块的相关说明,但是个人感觉这个模块非常实用,下面就简单介绍一个特征管理的基本应用。

开始

在租户管理中,有一个“管理功能”按钮,默认是没有数据的,界面上也没有地方维护。

特征管理简单来说就是在同一套系统中为不同的租户提供一些差异化的功能。比如免费用户,提供的是基础功能,VIP用户则会多一些高级功能。

定义特征

在Application.Contracts项目中添加Features文件夹。

src\Xhznl.HelloAbp.Application.Contracts\Features\HelloAbpFeatures.cs:

public class HelloAbpFeatures
{public const string GroupName = "HelloAbp";public const string SocialLogins = GroupName + ".SocialLogins";public const string UserCount = GroupName + ".UserCount";
}

src\Xhznl.HelloAbp.Application.Contracts\Features\HelloAbpFeatureDefinitionProvider.cs:

public class HelloAbpFeatureDefinitionProvider : FeatureDefinitionProvider
{public override void Define(IFeatureDefinitionContext context){var group = context.AddGroup(HelloAbpFeatures.GroupName);group.AddFeature(HelloAbpFeatures.SocialLogins, "true", L("Feature:SocialLogins"), valueType: new ToggleStringValueType());group.AddFeature(HelloAbpFeatures.UserCount, "10", L("Feature:UserCount"), valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000)));}private static LocalizableString L(string name){return LocalizableString.Create<HelloAbpResource>(name);}
}

以上代码添加了2个特征:SocialLogins,UserCount。

SocialLogins(社交登录),valueType为ToggleStringValueType,意味着它是个勾选框,默认值为"true"。

UserCount(用户数量),valueType为FreeTextStringValueType,意味着它是个输入框,默认值为"10"。

现在可以为不同租户设置不同的特征值。

应用特征

特征值定义好了,接下来就是如何应用了,首先看一下用户数量如何控制。

用户数量

目前用户是通过/identity/users接口来添加的,那么我们重写这个接口对应的服务方法就好了。关于重写服务可以参考:重写服务[1]

对应的ABP源码在:abp\modules\identity\src\Volo.Abp.Identity.Application\Volo\Abp\Identity\IdentityUserAppService.cs中。

在我们的Application项目中添加一个服务类继承IdentityUserAppService,重写CreateAsync方法,使用FeatureChecker获取到特征值,然后做个用户数量校验即可。

src\Xhznl.HelloAbp.Application\Identity\HelloIdentityUserAppService.cs:

[RemoteService(IsEnabled = false)]
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IIdentityUserAppService), typeof(IdentityUserAppService))]
public class HelloIdentityUserAppService : IdentityUserAppService, IHelloIdentityUserAppService
{private readonly IStringLocalizer<HelloAbpResource> _localizer;public HelloIdentityUserAppService(IdentityUserManager userManager,IIdentityUserRepository userRepository,IIdentityRoleRepository roleRepository,IStringLocalizer<HelloAbpResource> localizer) : base(userManager, userRepository, roleRepository){_localizer = localizer;}public override async Task<IdentityUserDto> CreateAsync(IdentityUserCreateDto input){var userCount = (await FeatureChecker.GetOrNullAsync(HelloAbpFeatures.UserCount)).To<int>();var currentUserCount = await UserRepository.GetCountAsync();if (currentUserCount >= userCount){throw new UserFriendlyException(_localizer["Feature:UserCount.Maximum", userCount]);}return await base.CreateAsync(input);}
}

下面可以将某租户的用户数量设置一下,测试是否有效果:

这样,就实现了对不同租户用户数量的限制。

社交登录

特征值也可以在前端使用,在/abp/application-configuration中就可以获取到。

拿到特征值,前端也可以做一些差异化功能,比如这里的是否支持社交登录。


关于Feature就简单介绍到这里,本项目源码放在:https://github.com/xiajingren/HelloAbp

另外非常感谢热心小伙@jonny-xhl[2]给添加的设置模块(来自EasyAbp的Abp.SettingUi[3])。

最后

本文只是对Feature的最基本介绍,关于Feature,还有很多实用的API方法,基于Feature可以满足很多定制化需求,想深入了解的话可以看下Abp.FeatureManagement源码。

感谢@jonny-xhl的pr。

参考资料

[1]

重写服务: https://docs.abp.io/zh-Hans/abp/latest/Customizing-Application-Modules-Overriding-Services

[2]

jonny-xhl: https://github.com/jonny-xhl

[3]

Abp.SettingUi: https://github.com/EasyAbp/Abp.SettingUi

如果本文对您有用,

不妨点个“”或者转发朋友圈支持一下

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

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

相关文章

.NET Core 中导入导出Excel

操作Excel是一个比较常见的业务场景&#xff0c;本篇将使用EPPlus简单演示一个导入导出的示例。EPPlus开源地址&#xff1a;https://github.com/EPPlusSoftware/EPPlus在项目中添加EPPlus组件Install-Package EPPlus导入先准备一个Excel文件&#xff0c;将其内容读取出来&#…

不会webpack的前端可能是捡来的,万字总结webpack的超入门核心知识

一文了解webpack入门核心知识&#x1f3a8;序言&#x1f4c5;一、webpack究竟是什么1、写在前面2、什么是模块打包工具&#xff1f;&#x1f4d0;二、如何用Webpack搭建环境1、安装node2、创建项目3、初始化项目4、安装webpack5、安装具体版本的webpack⚙️三、Webpack的配置文…

剑指 Offer 05. 替换空格(两种做法)

一:题目 二:上码 1:方法一 class Solution { public:string replaceSpace(string s) {string str "";for(int i 0; i < s.size(); i) {if(s[i] ){str "%20";}else{str s[i];}}return str;} };2:方法二&#xff08;双指针&#xff09; class So…

.NET Core 中生成验证码

在开发中&#xff0c;有时候生成验证码的场景目前还是存在的&#xff0c;本篇演示不依赖第三方组件&#xff0c;生成随机验证码图片。先添加验证码接口public interface ICaptcha {/// <summary>/// 生成随机验证码/// </summary>/// <param name"codeLeng…

10分钟手把手教你用Android手撸一个简易的个人记账App

用Android手撸一个简易的个人记账系统⛱️序言&#x1f4cb;一、系统结构设计Design1. 需求分析2. 数据库设计3. 界面设计4. 过程设计&#x1f4d8;二、编码阶段Coding1. 项目结构&#x1f5c2;️&#xff08;1&#xff09;文件目录&#xff08;2&#xff09;AndroidManifest.x…

像素级调整,高效转换——轻松提升你的图片处理体验!

探索更高级的图片处理体验&#xff0c;我们为你带来像素级调整与高效转换的完美结合&#xff01;借助我们的专业工具&#xff0c;轻松调整图片像素&#xff0c;让你在细节处展现无限创意&#xff0c;提升作品质感。 第一步&#xff0c;进入首助编辑高手主页面&#xff0c;可以看…

ABP VNext实践之搭建可用于生产的IdentityServer4

一、前言用了半年多的abp vnext&#xff0c;在开发的效果还是非常的好&#xff0c;可以说节省了很多时间&#xff0c;像事件总线、模块化开发、动态API进行远程调用、自动API控制器等等&#xff0c;一整套的规范&#xff0c;让开发人员更方便的集成&#xff0c;提升效率&#x…

151. 翻转字符串里的单词(思路+详解)

一:题目 二:上码 class Solution { public://利用双指针使除去多余的空格,定义快慢指针&#xff0c;最后满指针指向的位置就是除去冗余空格后的字符串//大小void removespacing(string& s){int slowIndex 0,fastIndex 0;//去掉字符串前面的字符while(s.size() > 0 &a…

一文了解树在前端中的应用,掌握数据结构中树的生命线

一文了解树在前端中的应用&#x1f3d5;️序言&#x1f332;一、树是什么&#xff1f;&#x1f334;二、深/广度优先遍历1、深度优先遍历&#xff08;1&#xff09;定义&#xff08;2&#xff09;口诀&#xff08;3&#xff09;代码实现2、广度优先遍历&#xff08;1&#xff0…

【追加功能】OFFICE插件管理工具重整后再上路,更好用易用。

现在使用OFFICE插件的群体越来越多&#xff0c;在8月份修复过的【OFFICE插件管理工具】&#xff0c;尝试将COM加载项的插件管理进行完善。但仍然有一小部分普通加载项的管理未能加到里面。特别是近期用户反馈到的EasyShu插件不能取消加载问题&#xff08;这个是一个bug&#xf…

剑指 Offer 58 - II. 左旋转字符串

一:题目 二:上码 class Solution { public:string reverseLeftWords(string s, int n) {string str1 s.substr(0,n);//(开始位置&#xff0c;个数)string str2 s.substr(n);return str2str1;} };

太平洋大西洋水流问题如何解决?一文了解图在前端中的应用

一文了解图在前端中的应用&#x1f3a7;序言&#x1f3a4;一、图是什么&#xff1f;1、定义2、举例&#x1f3b9;二、图的表示法1、邻接矩阵表示法2、邻接表表示法&#x1f3ba;三、图的常用操作1、图的深度优先遍历&#xff08;1&#xff09;定义&#xff08;2&#xff09;口诀…

统信发布UOS V20 进军个人市场 生态日益完善

日前&#xff0c;统信桌面操作系统V20个人版正式发布&#xff0c;统信UOS是国产操作系统中屈指可数的在民间拥有一批爱好者和发烧友的操作系统&#xff0c;本次统信发布UOS V20个人版&#xff0c;吹响了进军TO C市场的号角。根据官方宣传介绍&#xff0c;统信桌面操作系统V20个…

leetcode28. 实现 strStr(KMP详解)

一:题目 二&#xff1a;思路 三:上码 // class Solution { // public: // int strStr(string haystack, string needle) { // if (needle.size()0) // return 0; // if (needle.size() > haystack.size()) // return -1; // …

在Docker中配置ASP.NETCore的HTTPS模式

&#xff08;The Continued Rising Power of Developers&#xff09;使用HTTPS&#xff0c;让网站更安全PS&#xff1a;经过两周的学习和部署迁移&#xff0c;目前已经把所有后端都迁到了基于Docker的Jenkins里了&#xff0c;相关文章可以参考《使用Jenkins来发布和代理.NetCor…

最小堆最大堆了解吗?一文了解堆在前端中的应用

一文了解堆在前端中的应用⚡序言&#x1f998;一、堆是什么&#xff1f;&#x1f425;二、JS中的堆&#x1f41d;三、堆的应用&#x1f408;四、构建一个最小堆1. 定义2. 方法3. 用js代码实现最小堆&#xff08;1&#xff09;初始化一个堆&#xff08;2&#xff09;交换位置swa…

​如何编写高质量的C#代码(一)

如何编写高质量的C#代码&#xff08;一&#xff09;从”整洁代码“谈起一千个读者&#xff0c;就有一千个哈姆雷特&#xff0c;代码质量也同样如此。想必每一个对于代码有追求的开发者&#xff0c;对于“高质量”这个词&#xff0c;或多或少都有自己的一丝理解。当我在长沙.NET…

可视化太酷辽!一文了解排序和搜索算法在前端中的应用

一文了解排序和搜索算法在前端中的应用⏳序言&#x1f9ed;一、文章结构抢先知⌚二、排序和搜索1、定义2、JS中的排序和搜索⏰三、排序算法1、冒泡排序&#x1f4a1;&#xff08;1&#xff09;定义&#xff08;2&#xff09;实现思路&#xff08;3&#xff09;图例&#xff08;…

leetcode双指针合集

27. 移除元素 class Solution { public:int removeElement(vector<int>& nums, int val) {/**思路:使用快慢指针&#xff0c;快指针正常往后移动,并将获取的值给慢指针&#xff0c;但是当快指针所指向的值是val的时候慢指针便不再更新;**/ int slowIndex 0;for(…

网络安全逐渐成为程序员的必备技能

大家好&#xff0c;我是Z哥。不知道大家有没有发现。如今&#xff0c;曝光某些知名公司信息泄露的事件频率越来越高。与之对应的&#xff0c;网络安全问题也越来越受到重视。从百度指数摘录了两张图给大家分享下。可以看到&#xff0c;对网络安全相关的信息和关注度在逐渐走高&…