Browse Source

upgrade RulesEngine

pull/294/head
cKey 4 years ago
parent
commit
47a3add772
  1. 2
      aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN.Abp.Rules.RulesEngine.csproj
  2. 10
      aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/AbpRulesEngineOptions.cs
  3. 7
      aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/FileProviders/FileProviderWorkflowRulesResolveContributor.cs
  4. 2
      aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/FileProviders/Physical/AbpRulesEnginePhysicalFileResolveOptions.cs
  5. 4
      aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/FileProviders/Physical/PhysicalFileWorkflowRulesResolveContributor.cs
  6. 19
      aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/RulesEngineContributor.cs
  7. 2
      aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/README.md
  8. 6
      aspnet-core/modules/rules/LINGYUN.Abp.Rules/LINGYUN/Abp/Rules/RulesInitializationContext.cs
  9. 2
      aspnet-core/tests/LINGYUN.Abp.Rules.RulesEngine.Tests/LINGYUN/Abp/Rules/RulesEngine/AbpRulesEngineTestModule.cs
  10. 1
      aspnet-core/tests/LINGYUN.Abp.Rules.RulesEngine.Tests/LINGYUN/Abp/Rules/RulesEngine/TestInputRuleTests.cs

2
aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN.Abp.Rules.RulesEngine.csproj

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="RulesEngine" Version="3.1.0" /> <PackageReference Include="RulesEngine" Version="3.3.0" />
<PackageReference Include="Volo.Abp.Json" Version="4.4.0" /> <PackageReference Include="Volo.Abp.Json" Version="4.4.0" />
</ItemGroup> </ItemGroup>

10
aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/AbpRulesEngineOptions.cs

@ -1,4 +1,4 @@
using Volo.Abp.Collections; using RulesEngine.Models;
namespace LINGYUN.Abp.Rules.RulesEngine namespace LINGYUN.Abp.Rules.RulesEngine
{ {
@ -8,9 +8,17 @@ namespace LINGYUN.Abp.Rules.RulesEngine
/// 是否忽略租户 /// 是否忽略租户
/// </summary> /// </summary>
public bool IgnoreMultiTenancy { get; set; } public bool IgnoreMultiTenancy { get; set; }
/// <summary>
/// 规则引擎可配置
/// </summary>
public ReSettings Settings { get; set; }
public AbpRulesEngineOptions() public AbpRulesEngineOptions()
{ {
Settings = new ReSettings
{
NestedRuleExecutionMode = NestedRuleExecutionMode.Performance
};
} }
} }
} }

7
aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/FileProviders/FileProviderWorkflowRulesResolveContributor.cs

@ -17,7 +17,6 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders
protected IJsonSerializer JsonSerializer { get; private set; } protected IJsonSerializer JsonSerializer { get; private set; }
protected IFileProvider FileProvider { get; private set; } protected IFileProvider FileProvider { get; private set; }
protected FileProviderWorkflowRulesResolveContributor() protected FileProviderWorkflowRulesResolveContributor()
{ {
} }
@ -26,8 +25,8 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders
{ {
Initialize(context.ServiceProvider); Initialize(context.ServiceProvider);
RulesCache = context.ServiceProvider.GetRequiredService<IMemoryCache>(); RulesCache = context.GetRequiredService<IMemoryCache>();
JsonSerializer = context.ServiceProvider.GetRequiredService<IJsonSerializer>(); JsonSerializer = context.GetRequiredService<IJsonSerializer>();
FileProvider = BuildFileProvider(context); FileProvider = BuildFileProvider(context);
} }
@ -81,11 +80,11 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders
if (fileInfo != null && fileInfo.Exists) if (fileInfo != null && fileInfo.Exists)
{ {
// 规则文件监控 // 规则文件监控
// TODO: 删除模块的规则缓存还需要删除RulesEngine中rulesCache已编译的规则缓存
ChangeToken.OnChange( ChangeToken.OnChange(
() => FileProvider.Watch(ruleFile), () => FileProvider.Watch(ruleFile),
(int ruleId) => (int ruleId) =>
{ {
// 清除规则缓存
RulesCache.Remove(ruleId); RulesCache.Remove(ruleId);
}, ruleId); }, ruleId);

2
aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/FileProviders/Physical/AbpRulesEnginePthsicalFileResolveOptions.cs → aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/FileProviders/Physical/AbpRulesEnginePhysicalFileResolveOptions.cs

@ -1,6 +1,6 @@
namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders.Physical namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders.Physical
{ {
public class AbpRulesEnginePthsicalFileResolveOptions public class AbpRulesEnginePhysicalFileResolveOptions
{ {
/// <summary> /// <summary>
/// 本地文件路径 /// 本地文件路径

4
aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/FileProviders/Physical/PhysicalFileWorkflowRulesResolveContributor.cs

@ -13,7 +13,7 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders.Physical
private RuleIdGenerator _ruleIdGenerator; private RuleIdGenerator _ruleIdGenerator;
private AbpRulesEngineOptions _rulesEngineOptions; private AbpRulesEngineOptions _rulesEngineOptions;
private AbpRulesEnginePthsicalFileResolveOptions _fileResolveOptions; private AbpRulesEnginePhysicalFileResolveOptions _fileResolveOptions;
public PhysicalFileWorkflowRulesResolveContributor() public PhysicalFileWorkflowRulesResolveContributor()
{ {
@ -23,7 +23,7 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders.Physical
{ {
_ruleIdGenerator = serviceProvider.GetRequiredService<RuleIdGenerator>(); _ruleIdGenerator = serviceProvider.GetRequiredService<RuleIdGenerator>();
_rulesEngineOptions = serviceProvider.GetRequiredService<IOptions<AbpRulesEngineOptions>>().Value; _rulesEngineOptions = serviceProvider.GetRequiredService<IOptions<AbpRulesEngineOptions>>().Value;
_fileResolveOptions = serviceProvider.GetRequiredService<IOptions<AbpRulesEnginePthsicalFileResolveOptions>>().Value; _fileResolveOptions = serviceProvider.GetRequiredService<IOptions<AbpRulesEnginePhysicalFileResolveOptions>>().Value;
} }
protected override IFileProvider BuildFileProvider(RulesInitializationContext context) protected override IFileProvider BuildFileProvider(RulesInitializationContext context)

19
aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/LINGYUN/Abp/Rules/RulesEngine/RulesEngineContributor.cs

@ -1,4 +1,5 @@
using RulesEngine; using Microsoft.Extensions.Options;
using RulesEngine;
using RulesEngine.Interfaces; using RulesEngine.Interfaces;
using RulesEngine.Models; using RulesEngine.Models;
using System.Collections.Generic; using System.Collections.Generic;
@ -13,18 +14,20 @@ namespace LINGYUN.Abp.Rules.RulesEngine
public class RulesEngineContributor : RuleContributorBase, ISingletonDependency public class RulesEngineContributor : RuleContributorBase, ISingletonDependency
{ {
private IRulesEngine _ruleEngine; private IRulesEngine _ruleEngine;
private readonly AbpRulesEngineOptions _options;
private readonly IWorkflowRulesResolver _workflowRulesResolver; private readonly IWorkflowRulesResolver _workflowRulesResolver;
public RulesEngineContributor( public RulesEngineContributor(
IWorkflowRulesResolver workflowRulesResolver) IWorkflowRulesResolver workflowRulesResolver,
IOptions<AbpRulesEngineOptions> options)
{ {
_options = options.Value;
_workflowRulesResolver = workflowRulesResolver; _workflowRulesResolver = workflowRulesResolver;
} }
public override void Initialize(RulesInitializationContext context) public override void Initialize(RulesInitializationContext context)
{ {
_ruleEngine = CreateRulesEngine(); _ruleEngine = CreateRulesEngine();
_workflowRulesResolver.Initialize(context); _workflowRulesResolver.Initialize(context);
} }
@ -47,17 +50,13 @@ namespace LINGYUN.Abp.Rules.RulesEngine
/// <returns></returns> /// <returns></returns>
protected virtual Engine CreateRulesEngine() protected virtual Engine CreateRulesEngine()
{ {
var reSetting = new ReSettings return new Engine(Logger, _options.Settings);
{
NestedRuleExecutionMode = NestedRuleExecutionMode.Performance
};
return new Engine(Logger, reSetting);
} }
protected virtual async Task ExecuteRulesAsync<T>(T input, WorkflowRules[] workflowRules, object[] @params = null) protected virtual async Task ExecuteRulesAsync<T>(T input, WorkflowRules[] workflowRules, object[] @params = null)
{ {
_ruleEngine.AddWorkflow(workflowRules); // TODO: 性能缺陷 规则文件每一次调用都会重复编译
_ruleEngine.AddOrUpdateWorkflow(workflowRules);
// 传入参与验证的实体参数 // 传入参与验证的实体参数
var inputs = new List<object>() var inputs = new List<object>()

2
aspnet-core/modules/rules/LINGYUN.Abp.Rules.RulesEngine/README.md

@ -41,7 +41,7 @@ PhysicalPath/CurrentTenant.Id[如果存在]/验证规则实体类型名称[typeo
options.WorkflowRulesResolvers.Add(new FakeWorkflowRulesResolveContributor()); options.WorkflowRulesResolvers.Add(new FakeWorkflowRulesResolveContributor());
}); });
Configure<AbpRulesEnginePthsicalFileResolveOptions>(options => Configure<AbpRulesEnginePhysicalFileResolveOptions>(options =>
{ {
// 指定真实存在的本地文件路径, 否则将不会检索本地规则文件 // 指定真实存在的本地文件路径, 否则将不会检索本地规则文件
options.PhysicalPath = Path.Combine(Directory.GetCurrentDirectory(), "Rules"); options.PhysicalPath = Path.Combine(Directory.GetCurrentDirectory(), "Rules");

6
aspnet-core/modules/rules/LINGYUN.Abp.Rules/LINGYUN/Abp/Rules/RulesInitializationContext.cs

@ -1,14 +1,18 @@
using System; using System;
using Volo.Abp.Data;
namespace LINGYUN.Abp.Rules namespace LINGYUN.Abp.Rules
{ {
public class RulesInitializationContext : IServiceProvider public class RulesInitializationContext : IServiceProvider, IHasExtraProperties
{ {
public IServiceProvider ServiceProvider { get; } public IServiceProvider ServiceProvider { get; }
public ExtraPropertyDictionary ExtraProperties { get; }
internal RulesInitializationContext(IServiceProvider serviceProvider) internal RulesInitializationContext(IServiceProvider serviceProvider)
{ {
ServiceProvider = serviceProvider; ServiceProvider = serviceProvider;
ExtraProperties = new ExtraPropertyDictionary();
} }
public object GetService(Type serviceType) => ServiceProvider.GetService(serviceType); public object GetService(Type serviceType) => ServiceProvider.GetService(serviceType);

2
aspnet-core/tests/LINGYUN.Abp.Rules.RulesEngine.Tests/LINGYUN/Abp/Rules/RulesEngine/AbpRulesEngineTestModule.cs

@ -12,7 +12,7 @@ namespace LINGYUN.Abp.Rules.RulesEngine
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
Configure<AbpRulesEnginePthsicalFileResolveOptions>(options => Configure<AbpRulesEnginePhysicalFileResolveOptions>(options =>
{ {
options.PhysicalPath = Path.Combine(Directory.GetCurrentDirectory(), "Rules"); options.PhysicalPath = Path.Combine(Directory.GetCurrentDirectory(), "Rules");
}); });

1
aspnet-core/tests/LINGYUN.Abp.Rules.RulesEngine.Tests/LINGYUN/Abp/Rules/RulesEngine/TestInputRuleTests.cs

@ -1,4 +1,5 @@
using Shouldly; using Shouldly;
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Xunit; using Xunit;

Loading…
Cancel
Save