🚀 功能管理:基于 ABP 的 Feature Management 实现动态开关
📚 一、背景分析
在 SaaS 场景中,业务常常要求:
- 🌐 不同租户具备不同功能开关
- 🔀 根据套餐或版本灰度发布新功能
- 🎯 控制功能粒度细化、灵活
ABP 的 Feature Management 模块内建对租户、主机、版本多级别支持,配合后台 UI 可视化管理界面,让开发者无需侵入业务逻辑即可控制功能可用性和灰度发布。
🧩 二、核心功能设计
2.1 定义 Feature 常量与分组
// 文件:MyApp.Domain.Shared/Feature/MyAppFeatures.cs
namespace MyApp.FeatureManagement
{
/// <summary>
/// 功能标识常量
/// </summary>
public static class MyAppFeatures
{
// 布尔型开关:控制是否启用 PDF 报表功能
public const string EnablePdfReport = "MyApp.EnablePdfReport";
// 数值型限额:导出功能限额
public const string ExportLimit = "MyApp.ExportLimit";
}
}
2.2 实现 FeatureDefinitionProvider 🛠️
将以下类放在 MyApp.Domain.Shared 或其他 ABP 扫描范围内的项目中,框架会自动发现并加载。
// 文件:MyApp.Domain.Shared/Feature/MyAppFeatureDefinitionProvider.cs
using Volo.Abp.FeatureManagement;
using Volo.Abp.FeatureManagement.Definitions;
using Volo.Abp.Localization;
using Volo.Abp.Validation.StringValues;
namespace MyApp.FeatureManagement
{
/// <summary>
/// 定义 MyApp 相关的 Feature
/// </summary>
public class MyAppFeatureDefinitionProvider : FeatureDefinitionProvider
{
public override void Define(IFeatureDefinitionContext context)
{
// 将所有 MyApp 下的 Feature 放到同一分组
var group = context.AddGroup(
"MyApp",
LocalizableString.Create<MyAppResource>("MyApp")
);
// 布尔型开关,仅允许 true/false
group.AddFeature(
MyAppFeatures.EnablePdfReport,
defaultValue: "false",
displayName: LocalizableString.Create<MyAppResource>("EnablePdfReport"),
valueType: new ToggleStringValueType()
);
// 自由文本型,通过 NumericValueValidator 限制数值范围 1~10000
group.AddFeature(
MyAppFeatures.ExportLimit,
defaultValue: "100",
displayName: LocalizableString.Create<MyAppResource>("ExportLimit"),
valueType: new FreeTextStringValueType(
new NumericValueValidator(1, 10000)
)
);
}
}
}
ℹ️ 说明:
- 在 ABP v9.1.3 中,只要将
FeatureDefinitionProvider放在被框架扫描的项目(如Domain.Shared),就会自动注册。- 若需要集中管理加载顺序,可在应用模块中显式通过
AbpFeatureManagementOptions.DefinitionProviders.Add<>()注册。
2.3 注册到模块 ⚙️
如果您希望显式手动注册 FeatureDefinitionProvider,可在模块中添加以下配置;否则框架会自动扫描加载,无需再写这段。
// 文件:MyApp.Application/MyAppApplicationModule.cs
using Volo.Abp.Modules;
using Volo.Abp.FeatureManagement;
namespace MyApp
{
[DependsOn(
typeof(MyAppDomainSharedModule),
typeof(AbpFeatureManagementDomainModule)
)]
public class MyAppApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpFeatureManagementOptions>(options =>
{
// 可选:显式添加定义提供者
// options.DefinitionProviders.Add<MyAppFeatureDefinitionProvider>();
});
}
}
}

最低0.47元/天 解锁文章
1020

被折叠的 条评论
为什么被折叠?



