Является ли это правильным способом определения правила в 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);
        }

    }
}

Как видите, я вызываю другой метод с правилом для оценки нескольких условий. Мне кажется, что я не использую здесь полную функциональность алгоритма Рете, так как я предварительно оцениваю вещи для себя. Может ли кто-нибудь подсказать мне, как подойти к этому?


person talaa123    schedule 02.03.2016    source источник


Ответы (1)


Ваш код выглядит хорошо, у вас есть сложное правило, и вы его инкапсулируете.

Следуя документации и примерам, вы можете реализовать элегантное решение.

Реализация сложной логики с .Query вместо .Exists, переводя вашу инкапсулированную логику в выражение linq или lambda. Затем примените расширение DSL, чтобы сделать ваш код более читабельным.

person jotade    schedule 10.08.2017