Fixed dynamic object support when using RuleParameter (#33)

pull/41/head
Abbas Cyclewala 2020-07-20 20:04:18 +05:30 committed by GitHub
parent c82576e4ee
commit 170b494b66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 93 additions and 76 deletions

60
demo/DemoApp/BasicDemo.cs Normal file
View File

@ -0,0 +1,60 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using RulesEngine.Models;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using static RulesEngine.Extensions.ListofRuleResultTreeExtension;
namespace DemoApp
{
public class BasicDemo
{
public void Run()
{
Console.WriteLine($"Running {nameof(BasicDemo)}....");
var basicInfo = "{\"name\": \"hello\",\"email\": \"abcy@xyz.com\",\"creditHistory\": \"good\",\"country\": \"canada\",\"loyalityFactor\": 3,\"totalPurchasesToDate\": 10000}";
var orderInfo = "{\"totalOrders\": 5,\"recurringItems\": 2}";
var telemetryInfo = "{\"noOfVisitsPerMonth\": 10,\"percentageOfBuyingToVisit\": 15}";
var converter = new ExpandoObjectConverter();
dynamic input1 = JsonConvert.DeserializeObject<ExpandoObject>(basicInfo, converter);
dynamic input2 = JsonConvert.DeserializeObject<ExpandoObject>(orderInfo, converter);
dynamic input3 = JsonConvert.DeserializeObject<ExpandoObject>(telemetryInfo, converter);
var inputs = new dynamic[]
{
input1,
input2,
input3
};
var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "Discount.json", SearchOption.AllDirectories);
if (files == null || files.Length == 0)
throw new Exception("Rules not found.");
var fileData = File.ReadAllText(files[0]);
var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(fileData);
var bre = new RulesEngine.RulesEngine(workflowRules.ToArray(), null);
string discountOffered = "No discount offered.";
List<RuleResultTree> resultList = bre.ExecuteRule("Discount", inputs);
resultList.OnSuccess((eventName) =>
{
discountOffered = $"Discount offered is {eventName} % over MRP.";
});
resultList.OnFail(() =>
{
discountOffered = "The user is not eligible for any discount.";
});
Console.WriteLine(discountOffered);
}
}
}

View File

@ -13,10 +13,11 @@ namespace DemoApp
public string Value { get; set; }
}
class NestedInputDemo
public class NestedInputDemo
{
public static void Main(string[] args)
public void Run()
{
Console.WriteLine($"Running {nameof(NestedInputDemo)}....");
var nestedInput = new {
SimpleProp = "simpleProp",
NestedProp = new
@ -57,8 +58,7 @@ namespace DemoApp
}).OnFail(() =>
{
Console.WriteLine($"{workflow.WorkflowName} evaluation resulted in failure");
})
;
});
}

View File

@ -1,63 +1,14 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using RulesEngine.Models;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using static RulesEngine.Extensions.ListofRuleResultTreeExtension;
namespace DemoApp
{
class Program
static class Program
{
static void Main(string[] args)
{
var basicInfo = "{\"name\": \"Dishant\",\"email\": \"dishantmunjal@live.com\",\"creditHistory\": \"good\",\"country\": \"canada\",\"loyalityFactor\": 3,\"totalPurchasesToDate\": 10000}";
var orderInfo = "{\"totalOrders\": 5,\"recurringItems\": 2}";
var telemetryInfo = "{\"noOfVisitsPerMonth\": 10,\"percentageOfBuyingToVisit\": 15}";
var converter = new ExpandoObjectConverter();
dynamic input1 = JsonConvert.DeserializeObject<ExpandoObject>(basicInfo, converter);
dynamic input2 = JsonConvert.DeserializeObject<ExpandoObject>(orderInfo, converter);
dynamic input3 = JsonConvert.DeserializeObject<ExpandoObject>(telemetryInfo, converter);
var inputs = new dynamic[]
{
input1,
input2,
input3
};
var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "Discount.json", SearchOption.AllDirectories);
if (files == null || files.Length == 0)
throw new Exception("Rules not found.");
var fileData = File.ReadAllText(files[0]);
var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(fileData);
var bre = new RulesEngine.RulesEngine(workflowRules.ToArray(), null);
string discountOffered = "No discount offered.";
List<RuleResultTree> resultList = bre.ExecuteRule("Discount", inputs);
resultList.OnSuccess((eventName) =>
{
discountOffered = $"Discount offered is {eventName} % over MRP.";
});
resultList.OnFail(() =>
{
discountOffered = "The user is not eligible for any discount.";
});
Console.WriteLine(discountOffered);
new BasicDemo().Run();
new NestedInputDemo().Run();
}
}
}

View File

@ -3,34 +3,23 @@
using System;
using System.Diagnostics.CodeAnalysis;
using RulesEngine.HelperFunctions;
namespace RulesEngine.Models
{
[ExcludeFromCodeCoverage]
public class RuleParameter
{
public RuleParameter(Type type)
{
Type = type;
Name = type.Name;
}
public RuleParameter(Type type,string name)
{
Type = type;
Name = name;
}
public RuleParameter(string name,object value)
{
Type = value.GetType();
Value = Utils.GetTypedObject(value);
Type = Value.GetType();
Name = name;
Value = value;
}
public Type Type { get; set; }
public string Name { get; set; }
public object Value { get; set; }
public Type Type { get; }
public string Name { get; }
public object Value { get; }
}
}

View File

@ -60,8 +60,7 @@ namespace RulesEngine
for (int i = 0; i < inputs.Length; i++)
{
var input = inputs[i];
var obj = Utils.GetTypedObject(input);
ruleParams.Add(new RuleParameter($"input{i + 1}", obj));
ruleParams.Add(new RuleParameter($"input{i + 1}", input));
}
return ExecuteRule(workflowName, ruleParams.ToArray());

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Version>2.0.0</Version>
<Version>2.0.1</Version>
<Copyright>Copyright (c) Microsoft Corporation.</Copyright>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageProjectUrl>https://github.com/microsoft/RulesEngine</PackageProjectUrl>

View File

@ -31,6 +31,24 @@ namespace RulesEngine.UnitTest
Assert.NotNull(typedobj.GetType().GetProperty("test"));
}
[Fact]
public void GetTypedObject_dynamicObject_multipleObjects()
{
dynamic obj = new ExpandoObject();
obj.test = "hello";
obj.testList = new List<int> { 1, 2, 3 };
dynamic obj2 = new ExpandoObject();
obj2.test = "world";
obj2.testList = new List<int> { 1, 2, 3 };
object typedobj = Utils.GetTypedObject(obj);
object typedobj2 = Utils.GetTypedObject(obj2);
Assert.IsNotType<ExpandoObject>(typedobj);
Assert.NotNull(typedobj.GetType().GetProperty("test"));
Console.WriteLine($"{typedobj.GetType()} & {typedobj2.GetType()}");
Assert.Equal(typedobj.GetType(),typedobj2.GetType());
}
[Fact]
public void GetTypedObject_nonDynamicObject()
{