初识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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java后端开发题库_2020年Java题库整理

    2020年Java题库整理(WUST)前言:去我的个人博客阅读效果更好哟。知识点整理:1.Java语言具有跨平台性,是一种面向对象的语言,程序具有可移植性,不可多继承。2.Java的标准版主要用于桌面级的应用和数据库的开发。3.main()的头定义只能为publicvoidmain,一个类中可以没有main()方法。4.接口可以继承接口。5.静态内部类不能访问外部类的非静态成员,内部类可…

    2022年4月11日
    44
  • SQL Server 配置管理器无法打开

    SQL Server 配置管理器无法打开在把机器重启后SQLSERVER配置管理器就无法正常打开了

    2022年7月20日
    15
  • js实现modbus_Modbus通讯协议「建议收藏」

    js实现modbus_Modbus通讯协议「建议收藏」Modbus通讯协议Modbus概述Modbus是由Modicon公司(现为施耐德电气的一个品牌)在1978年发明的,这是一个跨时代、里程碑式的网络协议,因为工业网络从此拉开了序幕。Modbus是全球第一个真正用于工业现场的总线协议,据不完全统计:截至到2004中,Modbus的节点安装数量已经超过了800万个,而且75%的产品为非施耐德产品,安装的地区遍及世界各地,可见其普及的程度,已经成为了事…

    2022年7月14日
    23
  • 避免硬编码[通俗易懂]

    避免硬编码[通俗易懂]第一种publicinterfaceConstants{/***SparkApplicationConstants*/StringSEPARATOR=””;StringSQLTYPE=”‘通话'”;}第三种importjava.util.Propertiesimport…

    2022年10月19日
    0
  • unity 方向向量_二面角距离公式

    unity 方向向量_二面角距离公式在学习Unity官方案例时,发现其中用了两种求物体XZ平面旋转夹角的方法:   方法1:floatangle=Vector3.Angle(fromVector,toVector);//求出两向量之间的夹角Vector3normal=Vector3.Cross(fromVector,toVector);//叉乘求出法线向量angle*=Mathf.Sig

    2022年8月30日
    0
  • Flume学习笔记「建议收藏」

    Flume学习笔记「建议收藏」Flume学习笔记Flume定义Flume基础架构Flume安装部署监控端口数据实时监控单个追加文件实时监控目录下多个新文件Flume定义Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单.Flume最主要的作用就是:实时读取服务器本地磁盘的数据,将数据写入到HDFS.Flume基础架构AgentAgent是一个JVM进程,它以事件的形式将数据从源头送至目的。Agent主要有3个部

    2025年6月2日
    0

发表回复

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

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