2008-10-16 10 views
65

Кто-нибудь знает о хорошей библиотеке правил библиотеки .NET (в идеале с открытым исходным кодом)? Мне нужно что-то, что может выполнять вложенные логические выражения, например (A AND B) AND (B ИЛИ C ИЛИ D). Мне нужно выполнить сравнение свойств объекта, например, A.P1 AND B.P1. (В идеале я мог бы сравнить любое свойство - A.P1 AND B.P2).Ищет простую библиотеку правил в .NET

Он должен хранить правила в базе данных (у меня есть много простой настраиваемой логики). И он должен иметь API создания правил/управления. Инструмент управления должен будет проверить экземпляры, чтобы определить, какие свойства доступны и какие существуют ограничения.

Спасибо!


О, еще одна вещь. В качестве механизма правил мне нужно включить концепцию Actions (Commands). Это то, что выполнится, когда выражение возвращает:

If (expression.Evaluation) { actions.Execute(); } 

Так что я вижу, как правило, что-то вроде:

class Rule 
{ 
    Expression Exp; 
    Actions[] Actions; 
    Run() 
    { 
     if(Exp.Evaluate()) 
     { 
      foreach(action in Actions) 
      { 
       action.Execute(); 
      } 
     } 
    } 
} 

ответ

5

Официальный решение MS для этого является Windows Workflow. Хотя я бы не назвал его «простым», он отвечает всем вашим требованиям (что потребует обширной структуры для удовлетворения, во всяком случае).

+0

Существует недостаток текущего механизма правил WF ... он использует очень небольшое подмножество выражений в кодировке, но на самом деле выполняет строковый синтаксический анализ для генерации базового кода, а не классов CodeDom. – 2008-10-16 14:50:21

+0

Первоначально я использовал Drools 3.0.But. Он не поддерживает .NET Framework 4.5. Могу ли я использовать это в качестве замены Drools ?? – 2014-03-05 13:20:45

+0

@ShyamDixit: Извините, понятия не имею, но я бы выбрал что-нибудь в текущей разработке над WF3. Этот ответ почти шесть лет. Не принимайте решения, читая древние статьи/вопросы/ответы. – Will 2014-03-05 13:29:06

7

Ну, так как логическое выражение - это всего лишь подмножество математического выражения, вы можете попробовать NCalc - Mathematical Expressions Evaluator for .NET на CodePlex.

+0

Эй, это на самом деле довольно аккуратно. Хотя из примеров я думаю, что может быть более элегантный способ оценки выражений делегата. Это может быть точкой расширения для вставки некоторого отражения в операнды выражения. – Kurtz 2008-10-16 14:27:00

7

Ни один из открытых источников .NET-движка не поддерживает сохранение правил в базе данных. Только те, которые хранят правила в базе данных, являются коммерческими. Я создал некоторые пользовательские интерфейсы для механизмов пользовательских правил, которые запускаются из базы данных, но это может быть нетривиально для реализации. Обычно это основная причина, по которой вы не увидите эту функцию бесплатно.

Насколько мне известно, ни один из них не будет соответствовать всем вашим критериям, но вот список тех, которые я знаю:

Простейшим является SRE
http://sourceforge.net/projects/sdsre/

Один с правилом управление пользовательский интерфейс NxBRE
http://www.agilepartner.net/oss/nxbre/

Drools.NET использует правила JBoss
http://droolsdotnet.codehaus.org/

Я лично никого из них не использовал, потому что все проекты, с которыми я работал, никогда не хотели использовать что-то встроенное. Большинство компаний считают, что это довольно легко сделать, но в конечном итоге тратить слишком много времени на кодирование и его реализацию. Это одна из тех областей, в которых правила Inv Invented Here Syndrome (NIH).

+2

Drools.NET - это не очень хорошая идея, зависит от реализации JVM в .NET. Все еще в бета-версии, попробовал, и это действительно не готово к выпуску IMHO. – pmlarocque 2008-10-16 14:18:25

+1

Кто-нибудь здесь использовал SRE? Каков был опыт? – Kurtz 2008-10-16 14:20:59

17

Это класс, который я использовал в прошлом. Он оценивает строки так же, как eval() делает в Javascript.

String result = ExpressionEvaluator.EvaluateToString("(2+5) < 8"); 

Все, что вам нужно сделать, это построить строку, которая будет оцениваться с бизнес-объектов, и это будет заботиться о всех сложной вложенной логики и т.д.

using System; 
using System.CodeDom.Compiler; 
using System.Globalization; 
using System.Reflection; 
using Microsoft.JScript; 

namespace Common.Rule 
{ 
    internal static class ExpressionEvaluator 
    { 
    #region static members 
    private static object _evaluator = GetEvaluator(); 
    private static Type _evaluatorType; 
    private const string _evaluatorSourceCode = 
     @"package Evaluator 
      { 
       class Evaluator 
       { 
        public function Eval(expr : String) : String 
        { 
        return eval(expr); 
        } 
       } 
      }"; 

    #endregion 

    #region static methods 
    private static object GetEvaluator() 
    { 
     CompilerParameters parameters; 
     parameters = new CompilerParameters(); 
     parameters.GenerateInMemory = true; 

     JScriptCodeProvider jp = new JScriptCodeProvider(); 
     CompilerResults results = jp.CompileAssemblyFromSource(parameters, _evaluatorSourceCode); 

     Assembly assembly = results.CompiledAssembly; 
     _evaluatorType = assembly.GetType("Evaluator.Evaluator"); 

     return Activator.CreateInstance(_evaluatorType); 
    } 

    /// <summary> 
    /// Executes the passed JScript Statement and returns the string representation of the result 
    /// </summary> 
    /// <param name="statement">A JScript statement to execute</param> 
    /// <returns>The string representation of the result of evaluating the passed statement</returns> 
    public static string EvaluateToString(string statement) 
    { 
     object o = EvaluateToObject(statement); 
     return o.ToString(); 
    } 

    /// <summary> 
    /// Executes the passed JScript Statement and returns the result 
    /// </summary> 
    /// <param name="statement">A JScript statement to execute</param> 
    /// <returns>The result of evaluating the passed statement</returns> 
    public static object EvaluateToObject(string statement) 
    { 
     lock (_evaluator) 
     { 
     return _evaluatorType.InvokeMember(
        "Eval", 
        BindingFlags.InvokeMethod, 
        null, 
        _evaluator, 
        new object[] { statement }, 
        CultureInfo.CurrentCulture 
       ); 
     } 
    } 
    #endregion 
    }  
} 
0

В зависимости от того, что вы пытаетесь использование этой формулы может быть использовано с помощью лямбда-выражений (и деревьев выражений).По сути, вы предоставляете выражение в виде строки, которая затем компилируется «на лету» в дерево выражений/выражений лямбда, которое затем можно выполнить (оценить). Сначала это не просто понять, но как только вы это сделаете, это очень мощно и довольно просто настроить.

46

Соглашаясь с волей, я бы сказал, что-то использовал из семейства рабочих процессов, хотя это не рабочий процесс. Исследуйте System.Workflow.Activities.Rules Пространство имен немного - оно поддерживается в .Net 3 и встроено в .Net3.5. У вас есть все, что в руке бесплатно использовать, как вы упомянули:

  • RuleCondition для условий, RuleAction для действий

  • стандартизированный формат для описания Metacode (CodeDOM - CodeExpressions)

  • вы можете плагин любой сложности в это (по правде говоря, кроме Linq и lambdas и так далее методов какого-либо) через TypeProviders

  • есть встроенный редактор для правила редактирования с IntelliSense

  • как правило сериализуем может быть легко сохраняется

  • , если вы имели в виду использовать правила над схеме базы данных, то с помощью typeprovider он может быть реализован слишком

Для стартера: Using rules outside of a workflow

Ps .: мы используем его широко и там вы гораздо больше в этом пространстве имен, чем вы когда-нибудь представить -> полный метаязык алгоритм

И самое главное: это простой в использовании - действительно

1

Я бы посмотрел Windows Workflow. Механизмы правил и рабочий процесс, как правило, начинаются просто и становятся все более сложными. Что-то вроде Windows Workflow Foundation не так уж сложно начать и дает возможность для роста. Here is a post that shows it's not too difficult to get a simple workflow engine going.

0

Возможно, выезд SmartRules. Это не бесплатно, но интерфейс выглядит достаточно просто.

Только знаю об этом, потому что раньше я использовал утилиту SmartCode codegen.

Вот пример правила с сайта:

BUSINESS RULES IN NATURAL LANGUAGE  

Before 
If (Customer.Age > 50 && Customer.Status == Status.Active) { 
policy.SetDiscount(true, 10%); 
} 

After (with Smart Rules) 
If Customer is older than 50 and 
the Customer Status is Active Then 
Apply 10 % of Discount 
0

Это не бесплатно, так как вы не можете легко распутать его из BizTalk происхождения, но компоненты двигателя Бизнес правил BizTalk являются отдельным юридическим лицом от основной процессор BizTalk, и содержит очень мощный механизм правил, который включает в себя графический интерфейс, основанный на правилах/политике. Если бы была свободная версия, это соответствовало бы вашим требованиям (покупка BizTalk только для BRE не будет действительно работать на коммерческой основе.)

3

Windows Workflow Foundation предоставляет вам бесплатный механизм вывода цепочки цепочек. И вы можете использовать его без части рабочего процесса. Создание и редактирование правил одобрено для разработчиков.

Если вы хотите, чтобы не программисты редактировали и поддерживали правила, вы можете опробовать Rule Manager.

Менеджер правил создаст для вас рабочее визуальное студийное решение. Это должно заставить вас начать довольно быстро. Просто нажмите «Файл \ Экспорт» и выберите формат WFRules.

1

Вы можете использовать RUEN, в простой, основанный атрибут с открытым исходным кодом Rule Engine, созданный мной:

http://ruen.codeplex.com

2

Вы можете посмотреть на нашем продукте, а также на http://www.FlexRule.com

FlexRule является основой двигателя бизнес-правил с поддержкой трех двигателей; Процессный двигатель, двигатель вывода и двигатель RuleFlow. Его механизм вывода - это прямой вывод цепочки, который использует расширенную реализацию алгоритма Rete.