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

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

Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。

前言

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

开始

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

<span>初识ABP vNext(8):ABP特征管理</span>

特征管理简单来说就是在同一套系统中为不同的租户提供一些差异化的功能。比如免费用户,提供的是基础功能,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″。

<span>初识ABP vNext(8):ABP特征管理</span>

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

应用特征

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

用户数量

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

<span>初识ABP vNext(8):ABP特征管理</span>

对应的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);
    }
}

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

<span>初识ABP vNext(8):ABP特征管理</span>

<span>初识ABP vNext(8):ABP特征管理</span>

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

社交登录

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

<span>初识ABP vNext(8):ABP特征管理</span>

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

<span>初识ABP vNext(8):ABP特征管理</span>

<span>初识ABP vNext(8):ABP特征管理</span>


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

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

<span>初识ABP vNext(8):ABP特征管理</span>

<span>初识ABP vNext(8):ABP特征管理</span>

最后

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

感谢@jonny-xhl的pr。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2639.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【转载】.NET Remoting学习笔记(三)信道

    【转载】.NET Remoting学习笔记(三)信道

    2021年11月18日
    70
  • WBS分解策略指南

    WBS分解策略指南1 nbsp nbsp nbsp nbsp nbsp nbsp 引言渐近明细是项目的特点 但这并不意味着不需要计划 没有计划或者是随意的不负责任的计划的项目是一种无法控制的项目 在软件高技术行业 日新月异是主要特点 因此计划的制定需要在一定条件的限制和假设之下采用渐近明细的方式进行不断完善 例如对于较为大型的软件开发

    2025年9月24日
    4
  • 存储卡的使用方法大全

    存储卡的使用方法大全存储卡的使用方法大全现在购买诺基亚手机,尤其是其智能手机的朋友是越来越多了,与其他品牌的机型相比,诺基亚的手机有一个最大的优点,就是支持储存卡内存扩充的机型比较多,这让大家在使用中不必再担心手机容量的问题,这也体现了诺基亚“科技以人为本”的宣传口号。今天,就为大家讲一讲适用于诺基

    2022年7月11日
    53
  • 无法解析类型java.lang.Object_java类型转换异常

    无法解析类型java.lang.Object_java类型转换异常问题场景:1、前端传一个数组,2、后台Controller用map接收。如下@PostMapping(“add/xxxx”)publicResponseObjaddXXXX(@RequestBodyMap<String,Object>map){}3、Service业务类方法中,直接获取数组并转化为实体的集合:List<XXXX&g…

    2025年9月2日
    7
  • python字符串截取方法_python从后往前截取字符串

    python字符串截取方法_python从后往前截取字符串Python截取字符串使用变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。#例1:字符串截取str=’12345678’printstr[0:1]>>1 #输出str位置0开始到位置1以前的字符printstr[1:6] >>23456 #输出str位置1开始到位置6以前的字符num=18str=’0000’+str(num) #合并字符串print

    2022年9月27日
    4
  • CSDN提现规则说明(更新:支持实时提现)

    提现范围1、博客(付费专栏、VIP可见文章)、学院讲师、必问、活动业务线等的收益进行合并提现;提现标准1、必须进行实名认证才可以进行提现;

    2022年4月12日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号