博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识ABP vNext(8):ABP特征管理
阅读量:4033 次
发布时间:2019-05-24

本文共 3649 字,大约阅读时间需要 12 分钟。

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

  • 定义特征

  • 应用特征

    • 用户数量

    • 社交登录

前言

上一篇提到了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
(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
 _localizer;    public HelloIdentityUserAppService(IdentityUserManager userManager,        IIdentityUserRepository userRepository,        IIdentityRoleRepository roleRepository,        IStringLocalizer
 localizer) : base(userManager, userRepository, roleRepository)    {        _localizer = localizer;    }    public override async Task
 CreateAsync(IdentityUserCreateDto input)    {        var userCount = (await FeatureChecker.GetOrNullAsync(HelloAbpFeatures.UserCount)).To
();        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://zgzdi.baihongyu.com/

你可能感兴趣的文章
慢慢欣赏linux 块设备驱动基础
查看>>
慢慢欣赏linux文件缓冲区 mmap分析
查看>>
慢慢欣赏linux 页面回收
查看>>
微视linux waitX的意义
查看>>
微视linux 挂接中断action的前奏 设置中断处理函数
查看>>
RCU锁学习
查看>>
ppc解析保留内存
查看>>
微视linux uboot保留内存的传递
查看>>
微视linux scsi驱动错误中断处理
查看>>
linux动态库学习
查看>>
微视linux 释放文件节点流程
查看>>
new的过程
查看>>
作用域、作用域链、自由变量、变量提升
查看>>
var let const 区别
查看>>
事件委托(事件代理)
查看>>
函数防抖和函数节流
查看>>
vue中diff算法
查看>>
电商后台管理系统打包上线
查看>>
Netty物联网高并发系统第一季
查看>>
Elasticsearch在互联网应用中遇到的问题汇总
查看>>