根据特定的规则模型,根据判断表达式判断传入数据集是否符合
- 如果传入规则不存在,默认会判断通过(返回True)
- 表达式默认是以x.开头,x.后面的是传入的数据集的属性名
- JS.Abp.RulesEngine.Application
- JS.Abp.RulesEngine.Application.Contracts
- JS.Abp.RulesEngine.Domain
- JS.Abp.RulesEngine.Domain.Shared
- JS.Abp.RulesEngine.EntityFrameworkCore
- JS.Abp.RulesEngine.HttpApi
- JS.Abp.RulesEngine.HttpApi.Client
*(Optional) JS.Abp.RulesEngine.Blazor *(Optional) JS.Abp.RulesEngine.Blazor.Server *(Optional) JS.Abp.RulesEngine.Blazor.WebAssembly *(Optional) JS.Abp.RulesEngine.Web
- [DependsOn(typeof(RulesEngineApplicationModule))]
- [DependsOn(typeof(RulesEngineApplicationContractsModule))]
- [DependsOn(typeof(RulesEngineDomainModule))]
- [DependsOn(typeof(RulesEngineDomainSharedModule))]
- [DependsOn(typeof(RulesEngineEntityFrameworkCoreModule))] OR [DependsOn(typeof(RulesEngineMongoDbModule))]
- [DependsOn(typeof(RulesEngineHttpApiModule))]
- [DependsOn(typeof(RulesEngineHttpApiClientModule))]
*(Optional) [DependsOn(typeof(RulesEngineBlazorModule))] *(Optional) [DependsOn(typeof(RulesEngineBlazorServerModule))] *(Optional) [DependsOn(typeof(RulesEngineBlazorWebAssemblyModule))] *(Optional) [DependsOn(typeof(RulesEngineWebModule))]
在 YourProject.EntityFrameworkCore 项目的目录中打开命令行终端,然后键入以下命令:
> dotnet ef migrations add Added_RulesEngine
> dotnet ef database update
MVC和Blazor已经实现了维护规则的页面,如果你的项目中没有使用这两个框架,你可以自己实现维护规则的页面
protected IRulesEngineStore rulesEngine => LazyServiceProvider.LazyGetRequiredService<IRulesEngineStore>();
//如下是维护的规则,正式代码下可不用
var input = new Rule
{
RuleName = "Test1",
SuccessEvent = "True",
ErrorMessage = "False",
ErrorType = default,
RuleExpressionType = default,
Expression = "x.Name == \"Test\" && x.Age >= 20"
};
//TestRule1不存在,会默认返回True
var result1 = await _rulesEngineStore.ExecuteRulesAsync("TestRule1", new TestDto(){Name = "Test",Age = 20});
//Test1判断通过返回True
var result2 = await _rulesEngineStore.ExecuteRulesAsync("Test1", new TestDto(){Name = "Test",Age = 20});
result2.IsSuccess.ShouldBeTrue();
//Test1判断不通过False
var result3 = await _rulesEngineStore.ExecuteRulesAsync("Test1", new TestDto(){Name = "TestRule",Age = 20});
result3.IsSuccess.ShouldBeFalse();
//使用规则引擎组
private readonly IRulesGroupsAppService _rulesGroupsAppService;
var result1 = await _rulesAppService.VerifyRuleAsync(new VerifyRuleDto()
{
RuleCode = "TestRule1",
ExtraProperties = new ExtraPropertyDictionary()//支持以Dictionary<string,object>传入
{
{"Name", "Test"},
{"Age", 20}
},
});
//使用规则引擎
private readonly IRulesAppService _rulesAppService;
var result1 = await _rulesGroupsAppService.VerifyRulesGroupAsync(new VerifyRuleGroupDto()
{
GroupName = "TestRule1",
ExtraProperties = new ExtraPropertyDictionary()//支持以Dictionary<string,object>传入
{
{"Name", "Test"},
{"Age", 20}
},
});
以电商为例,假设有如下规则
- 1.价格大于1000元满减500元
- 2.价格大于500元满减300元
- 3.价格大于200元满减100元
- 4.价格大于100元满减20元
- 1.可以现在前端判断一次,把结果返回前端
- 2.后端再判断一次,判断前端传入和后端计算结果是否一致 参考代码:JS.Abp.RulesEngine.Blazor.Server.Host/Pages/Books.razor
//判断是否有折扣
var result = await RulesGroupsAppService.VerifyRulesGroupAsync(new VerifyRuleGroupDto()
{
GroupName = "TestPrice",
ExtraProperties = new ExtraPropertyDictionary()
{
{"Price", BookList.Sum(c=>c.Price)}
},
});
if (result.IsSuccess)
{
if (!result.SuccessEvent.IsNullOrWhiteSpace())
{
Discount = result.SuccessEvent;
}
}