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

前言

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

开始

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

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

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

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

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

应用特征

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

用户数量

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

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

对应的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 vNext(8):ABP特征管理-LMLPHP

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

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

社交登录

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

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

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

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

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


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

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

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

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

最后

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

感谢@jonny-xhl的pr。

05-25 22:11