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>
<ItemGroup>
<PackageReference Include="RulesEngine" Version="3.1.0" />
<PackageReference Include="RulesEngine" Version="3.3.0" />
<PackageReference Include="Volo.Abp.Json" Version="4.4.0" />
</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
{
@ -8,9 +8,17 @@ namespace LINGYUN.Abp.Rules.RulesEngine
/// 是否忽略租户
/// </summary>
public bool IgnoreMultiTenancy { get; set; }
/// <summary>
/// 规则引擎可配置
/// </summary>
public ReSettings Settings { get; set; }
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 IFileProvider FileProvider { get; private set; }
protected FileProviderWorkflowRulesResolveContributor()
{
}
@ -26,8 +25,8 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders
{
Initialize(context.ServiceProvider);
RulesCache = context.ServiceProvider.GetRequiredService<IMemoryCache>();
JsonSerializer = context.ServiceProvider.GetRequiredService<IJsonSerializer>();
RulesCache = context.GetRequiredService<IMemoryCache>();
JsonSerializer = context.GetRequiredService<IJsonSerializer>();
FileProvider = BuildFileProvider(context);
}
@ -81,11 +80,11 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders
if (fileInfo != null && fileInfo.Exists)
{
// 规则文件监控
// TODO: 删除模块的规则缓存还需要删除RulesEngine中rulesCache已编译的规则缓存
ChangeToken.OnChange(
() => FileProvider.Watch(ruleFile),
(int ruleId) =>
{
// 清除规则缓存
RulesCache.Remove(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
{
public class AbpRulesEnginePthsicalFileResolveOptions
public class AbpRulesEnginePhysicalFileResolveOptions
{
/// <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 AbpRulesEngineOptions _rulesEngineOptions;
private AbpRulesEnginePthsicalFileResolveOptions _fileResolveOptions;
private AbpRulesEnginePhysicalFileResolveOptions _fileResolveOptions;
public PhysicalFileWorkflowRulesResolveContributor()
{
@ -23,7 +23,7 @@ namespace LINGYUN.Abp.Rules.RulesEngine.FileProviders.Physical
{
_ruleIdGenerator = serviceProvider.GetRequiredService<RuleIdGenerator>();
_rulesEngineOptions = serviceProvider.GetRequiredService<IOptions<AbpRulesEngineOptions>>().Value;
_fileResolveOptions = serviceProvider.GetRequiredService<IOptions<AbpRulesEnginePthsicalFileResolveOptions>>().Value;
_fileResolveOptions = serviceProvider.GetRequiredService<IOptions<AbpRulesEnginePhysicalFileResolveOptions>>().Value;
}
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.Models;
using System.Collections.Generic;
@ -13,18 +14,20 @@ namespace LINGYUN.Abp.Rules.RulesEngine
public class RulesEngineContributor : RuleContributorBase, ISingletonDependency
{
private IRulesEngine _ruleEngine;
private readonly AbpRulesEngineOptions _options;
private readonly IWorkflowRulesResolver _workflowRulesResolver;
public RulesEngineContributor(
IWorkflowRulesResolver workflowRulesResolver)
IWorkflowRulesResolver workflowRulesResolver,
IOptions<AbpRulesEngineOptions> options)
{
_options = options.Value;
_workflowRulesResolver = workflowRulesResolver;
}
public override void Initialize(RulesInitializationContext context)
{
_ruleEngine = CreateRulesEngine();
_workflowRulesResolver.Initialize(context);
}
@ -47,17 +50,13 @@ namespace LINGYUN.Abp.Rules.RulesEngine
/// <returns></returns>
protected virtual Engine CreateRulesEngine()
{
var reSetting = new ReSettings
{
NestedRuleExecutionMode = NestedRuleExecutionMode.Performance
};
return new Engine(Logger, reSetting);
return new Engine(Logger, _options.Settings);
}
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>()

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

@ -41,7 +41,7 @@ PhysicalPath/CurrentTenant.Id[如果存在]/验证规则实体类型名称[typeo
options.WorkflowRulesResolvers.Add(new FakeWorkflowRulesResolveContributor());
});
Configure<AbpRulesEnginePthsicalFileResolveOptions>(options =>
Configure<AbpRulesEnginePhysicalFileResolveOptions>(options =>
{
// 指定真实存在的本地文件路径, 否则将不会检索本地规则文件
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 Volo.Abp.Data;
namespace LINGYUN.Abp.Rules
{
public class RulesInitializationContext : IServiceProvider
public class RulesInitializationContext : IServiceProvider, IHasExtraProperties
{
public IServiceProvider ServiceProvider { get; }
public ExtraPropertyDictionary ExtraProperties { get; }
internal RulesInitializationContext(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
ExtraProperties = new ExtraPropertyDictionary();
}
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)
{
Configure<AbpRulesEnginePthsicalFileResolveOptions>(options =>
Configure<AbpRulesEnginePhysicalFileResolveOptions>(options =>
{
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 System;
using System.Threading.Tasks;
using Volo.Abp.Validation;
using Xunit;

Loading…
Cancel
Save