Подтвердить что ты не робот

Поиск простой библиотеки правил-движков в .NET.

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

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

Спасибо!


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

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

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

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

Ответ 1

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

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

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

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

  • есть встроенный редактор для правила редактирование с помощью intellisense

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

  • если вы хотите использовать правила над схемы базы данных, затем через typeprovider он также может быть реализован.

Для стартера:  Использование правил вне рабочего процесса

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

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

Ответ 2

Вот класс, который я использовал в прошлом. Он оценивает строки так же, как 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
  }    
}

Ответ 4

Ни один из движков .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).

Ответ 5

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Я бы посмотрел на Windows Workflow. Механизмы правил и рабочий процесс, как правило, начинаются просто и становятся все более сложными. Что-то вроде Windows Workflow Foundation не так уж сложно начать и дает возможность для роста. Вот сообщение, которое показывает, что не слишком сложно получить простой механизм работы.

Ответ 10

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

http://ruen.codeplex.com

Ответ 12

Попробуйте http://rulesengine.codeplex.com/

Это механизм правил с открытым исходным кодом С#, который работает с деревьями выражений.

Ответ 13

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

Ответ 14

Возможно, зайдите 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

Ответ 15

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