Это правильный способ определения правила в NRules?
public class AllowAtleastOneCountryRule : Rule
{
public override void Define()
{
Profile profile = null;
string str = @"At least one country has to be defined as 'permitted'";
bool enabled = AllRules.GetDict()[str];//Checks if the rule is enabled
When()
.Match<FundProfile>(() => productProfile)
.Exists<FundProfile>(p => enabled, p => RuleViolation(p));
Then()
.Do(_ => profile .DisplayError(str));
}
bool RuleViolation(FundProfile pp)
{
try
{
if (pp.DefaultMode.Equals(Helper.DefaultModes.Allow.ToString()))
{
if (pp.ListOfCountries.Count < pp.TotalCountries)//Okay
return false;
else//Rule violation
return true;
}
else//Deny
{
if (pp.ListOfCountries.Count > 0)//Okay
return false;
else//Rule violation
return true;
}
}
catch(Exception e)
{
throw new InvalidRuleException(e.Message);
}
}
}
Как видите, я вызываю другой метод с правилом для оценки нескольких условий. Я чувствую, что я не использую полную функциональность алгоритма Rete здесь, поскольку я предварительно оцениваю вещи для себя. Кто-нибудь может подсказать мне, как подойти к этому?
1 ответ
Ваш код выглядит хорошо, у вас есть сложное правило, и вы его инкапсулируете.
Следуя документации и образцам, вы можете реализовать элегантное решение.
Реализация сложной логики с .Query
вместо .Exists
перевод вашей инкапсулированной логики в выражение linq или lambda. Затем примените DSL Extension, чтобы сделать ваш код более читабельным.