Tips:本篇已加入系列文章閱讀目錄,可點擊查看更多相關文章。
前言
上一篇提到了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
接口來添加的,那么我們重寫這個接口對應的服務方法就好了。關於重寫服務可以參考:重寫服務
對應的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給添加的設置模塊(來自EasyAbp的Abp.SettingUi)。
最后
本文只是對Feature的最基本介紹,關於Feature,還有很多實用的API方法,基於Feature可以滿足很多定制化需求,想深入了解的話可以看下Abp.FeatureManagement源碼。
感謝@jonny-xhl的pr。