功能管理

介绍

大多数SaaS(多租户)应用程序都具有具有不同功能的版本(包)这样,他们可以为租户(客户)提供不同的 价格和功能选项

ASP.NET Boilerplate提供了一个功能系统,使其更容易。您可以定义功能,检查是否为租户启用了功能,并将功能系统集成到其他ASP.NET Boilerplate概念(如授权和 导航)。

关于IFeatureValueStore

要素系统使用IFeatureValueStore来获取要素的值。虽然您可以以自己的方式实现它,但它完全在 Module Zero项目中实现。如果未实现,则使用NullFeatureValueStore为所有要素返回null(因此在这种情况下使用默认要素值)。

要素类型

有两种基本功能类型。

布尔特征

可以是“真实”或“虚假”。可以启用或 禁用此类功能(对于版本或租户)。

价值特征

可以是任意值虽然它以字符串形式存储和检索,但数字也可以存储为字符串。

例如,我们的应用程序可能是一个任务管理应用程序,我们可能会限制在一个月内创建任务。想象一下,我们有两个不同的版本/包; 一个允许每月创建1,000个任务,而另一个允许每月创建5,000个任务。此功能应存储为值,而不仅仅是true或false。

定义功能

应在检查之前定义一个功能。一个 模块可以从派生定义其自身的特点FeatureProvider类。这是一个非常简单的功能提供程序,它定义了3个功能:

public class AppFeatureProvider : FeatureProvider
{
    public override void SetFeatures(IFeatureDefinitionContext context)
    {
        var sampleBooleanFeature = context.Create("SampleBooleanFeature", defaultValue: "false");
        sampleBooleanFeature.CreateChildFeature("SampleNumericFeature", defaultValue: "10");
        context.Create("SampleSelectionFeature", defaultValue: "B");
    }
}

创建功能提供程序后,我们必须在我们的模块的PreInitialize方法中注册它, 如下所示:

Configuration.Features.Providers.Add<AppFeatureProvider>();

基本功能属性

要素定义至少需要两个属性:

在这里,我们定义了一个名为“SampleBooleanFeature”的布尔特征,默认值为“false”(未启用)。我们还定义了两个值特征。请注意,SampleNumericFeature被定义为SampleBooleanFeature的子项。

提示:为要素名称创建一个const字符串,并在任何地方使用它以防止输入错误。

其他功能属性

虽然需要唯一名称和默认值属性,但有一些可选属性可用于更精细的控制。

让我们看看上面功能的一些更详细的定义:

public class AppFeatureProvider : FeatureProvider
{
    public override void SetFeatures(IFeatureDefinitionContext context)
    {
        var sampleBooleanFeature = context.Create(
            AppFeatures.SampleBooleanFeature,
            defaultValue: "false",
            displayName: L("Sample boolean feature"),
            inputType: new CheckboxInputType()
            );

        sampleBooleanFeature.CreateChildFeature(
            AppFeatures.SampleNumericFeature,
            defaultValue: "10",
            displayName: L("Sample numeric feature"),
            inputType: new SingleLineStringInputType(new NumericValueValidator(1, 1000000))
            );

        context.Create(
            AppFeatures.SampleSelectionFeature,
            defaultValue: "B",
            displayName: L("Sample selection feature"),
            inputType: new ComboboxInputType(
                new StaticLocalizableComboboxItemSource(
                    new LocalizableComboboxItem("A", L("Selection A")),
                    new LocalizableComboboxItem("B", L("Selection B")),
                    new LocalizableComboboxItem("C", L("Selection C"))
                    )
                )
            );
    }

    private static ILocalizableString L(string name)
    {
        return new LocalizableString(name, AbpZeroTemplateConsts.LocalizationSourceName);
    }
}

请注意,ASP.NET Boilerplate不使用输入类型定义。应用程序可以使用它们为功能创建输入。ASP.NET Boilerplate只提供基础架构以使其更容易。

功能层次结构

如示例功能提供程序中所示,功能可以具有子功能父特征通常被定义为布尔 特征。只有在启用父级功能后,子功能才可用。ASP.NET Boilerplate 强制执行此操作,但我们建议使用它。应用程序应该照顾它。

检查功能

我们定义一个功能来检查应用程序中的值,以允许或阻止每个租户的某些应用程序功能。有不同的方法来检查它。

使用RequiresFeature属性

我们可以为方法或类使用RequiredFeature属性,如下所示:

[RequiresFeature("ExportToExcel")]
public async Task<FileDto> GetReportToExcel(...)
{
    ...
}

仅当为当前租户启用“ExportToExcel”功能时才执行此方法(当前租户从 IAbpSession获取)。如果未启用, 则会自动抛出AbpAuthorizationException

因此,RequiresFeature属性应仅用于布尔类型功能否则,您可能会遇到例外情况。

RequiresFeature属性说明

ASP.NET Boilerplate使用动态方法拦截的功能进行功能检查。可以使用RequiresFeature属性的方法有一些限制。

也,

使用IFeatureChecker

我们可以注入并使用IFeatureChecker手动检查功能(它会自动注入并直接用于应用程序服务,MVC和Web API控制器)。

的IsEnabled

这用于简单地检查是否启用了给定功能。例:

public async Task<FileDto> GetReportToExcel(...)
{
    if (await FeatureChecker.IsEnabledAsync("ExportToExcel"))
    {
        throw new AbpAuthorizationException("You don't have this feature: ExportToExcel");
    }

    ...
}

IsEnabledAsync和其他方法也有同步版本。

IsEnabled方法应该用于布尔类型的功能,否则你可能会遇到异常。

如果您只想检查功能并抛出异常,如示例所示,则可以使用CheckEnabled方法。

的GetValue

用于获取值类型功能的功能的当前值。例:

var createdTaskCountInThisMonth = GetCreatedTaskCountInThisMonth();
if (createdTaskCountInThisMonth >= FeatureChecker.GetValue("MaxTaskCreationLimitPerMonth").To<int>())
{
    throw new AbpAuthorizationException("You exceed task creation limit for this month, sorry :(");
}

FeatureChecker方法还具有覆盖功能,不仅可以检查当前tenantId的功能,还可以检查指定的 tenantId功能。

客户端

在客户端(JavaScript),我们可以使用abp.features命名空间来获取功能的当前值。

的IsEnabled
var isEnabled = abp.features.isEnabled('SampleBooleanFeature');
的getValue
var value = abp.features.getValue('SampleNumericFeature');

功能管理器

如果需要功能定义,可以注入并使用 IFeatureManager

版本说明

ASP.NET Boilerplate框架没有内置版本系统,因为这样的系统需要一个数据库(用于存储版本,版本功能,租户版本映射等等)。因此,编辑系统在Module Zero中实现您可以将其用作现成的编辑系统或自己实施。

nidie.com.cn - 用心与你沟通