简单状态检查器
简单状态检查系统可用于基于某些动态条件来启用或禁用对象。例如,如果当前用户未被授予特定权限,可以在用户界面上禁用菜单项。简单状态检查系统提供了一种通用方式来定义和检查此类条件。
定义状态检查器
任何类都可以继承 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 });
内置状态检查器
PermissionDefinition、ApplicationMenuItem 和 ToolbarItem 对象已经实现了状态检查,并具有内置的通用状态检查器,您可以直接使用它们的扩展方法。
RequireAuthenticated();
RequirePermissions(bool requiresAll, params string[] permissions);
RequireFeatures(bool requiresAll, params string[] features);
RequireGlobalFeatures(bool requiresAll, params Type[] globalFeatures);
抠丁客


