项目

简单状态检查器

简单状态检查系统可用于基于某些动态条件来启用或禁用对象。例如,如果当前用户未被授予特定权限,可以在用户界面上禁用菜单项。简单状态检查系统提供了一种通用方式来定义和检查此类条件。

定义状态检查器

任何类都可以继承 IHasSimpleStateCheckers 以支持状态检查。

public class MyObject : IHasSimpleStateCheckers<MyObject>
{
    public int Id { get; set; }

    public List<ISimpleStateChecker<MyObject>> StateCheckers { get; }

    public MyObject()
    {
        StateCheckers = new List<ISimpleStateChecker<MyObject>>();
    }
}

MyObject 类包含一个状态检查器集合,您可以向其添加自定义检查器。

public class MyObjectStateChecker : ISimpleStateChecker<MyObject>
{
    public Task<bool> IsEnabledAsync(SimpleStateCheckerContext<MyObject> context)
    {
        var currentUser = context.ServiceProvider.GetRequiredService<ICurrentUser>();
        return Task.FromResult(currentUser.IsInRole("Admin"));
    }
}
var myobj = new MyObject()
{
    Id = 100
};

myobj.SimpleStateCheckers.Add(new MyObjectStateChecker());

定义全局状态检查器

AbpSimpleStateCheckerOptions 是一个选项类,用于为特定对象设置全局状态检查器。

示例:为 MyObject 添加全局状态:

services.Configure<AbpSimpleStateCheckerOptions<MyObject>>(options =>
{
    options.GlobalSimpleStateCheckers.Add<MyGlobalObjectStateChecker>();
    //options.GlobalSimpleStateCheckers.Add<>(); // 添加更多全局状态检查器
});

将此代码写入模块的 ConfigureServices 方法中。

检查状态

您可以注入 ISimpleStateCheckerManager<MyObject> 服务来检查状态。

bool enabled = await stateCheckerManager.IsEnabledAsync(myobj);

批量检查状态

如果存在许多需要状态检查的实例项,可能会产生性能问题。

在这种情况下,您可以实现 ISimpleBatchStateChecker。它可以一次性检查多个项目。 您需要确保将相同的 ISimpleBatchStateChecker 实例添加到多个实例的 SimpleStateCheckers 中。

SimpleBatchStateCheckerBase 继承了 ISimpleBatchStateChecker 接口,并默认实现了单个对象的 IsEnabledAsync 方法。

public class MyObjectBatchStateChecker : SimpleBatchStateCheckerBase<MyObject>
{
    public override Task<SimpleStateCheckerResult<MyObject>> IsEnabledAsync(SimpleBatchStateCheckerContext<MyObject> context)
    {
        var result = new SimpleStateCheckerResult<MyObject>(context.States);

        foreach (var myObject in context.States)
        {
            if (myObject.Id > 100)
            {
                result[myObject] = true;
            }
        }

        return Task.FromResult(result);
    }
}
var myobj1 = new MyObject()
{
    Id = 100
};
var myobj2 = new MyObject()
{
    Id = 99
};

var myObjectBatchStateChecker = new MyObjectBatchStateChecker();

myobj1.SimpleStateCheckers.Add(myObjectBatchStateChecker);
myobj2.SimpleStateCheckers.Add(myObjectBatchStateChecker);

SimpleStateCheckerResult<MyObject> stateCheckerResult = await stateCheckerManager.IsEnabledAsync(new []{ myobj1, myobj2 });

内置状态检查器

PermissionDefinitionApplicationMenuItemToolbarItem 对象已经实现了状态检查,并具有内置的通用状态检查器,您可以直接使用它们的扩展方法。

RequireAuthenticated();
RequirePermissions(bool requiresAll, params string[] permissions);
RequireFeatures(bool requiresAll, params string[] features);
RequireGlobalFeatures(bool requiresAll, params Type[] globalFeatures);
在本文档中