2016-03-02 93 views
2
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算法的全部功能,因爲我正在爲自己預先評估一些事情。 任何人都可以指導我如何解決這個問題?這是在NRules中定義規則的正確方法嗎?

回答

0

你的代碼看起來不錯,你有一個複雜的規則,你封裝它。

按照文檔和示例,您可以實現一個優雅的解決方案。

執行complex logic.Query而不是.Exists,將您的封裝邏輯轉換爲linq或lambda表達式。 然後應用DSL Extension,使您的代碼更具可讀性。

相關問題