web-dev-qa-db-ja.com

.NETで簡単なルールエンジンライブラリを探している

誰もが優れた.NETライブラリルールライブラリ(理想的にはオープンソース)を知っていますか?ネストされた論理式を実行できるもの、たとえば(A AND B)AND(B OR C OR D)。 A.P1 AND B.P1などのオブジェクトプロパティ(理想的には、A.P1 AND B.P2の任意のプロパティを比較できます)。

ルールをデータベースに保存する必要があります(単純な構成可能なロジックがたくさんあります)。また、ルール作成/管理APIが必要です。管理ツールは、インスタンスを検査して、使用可能なプロパティと存在する制約を判断する必要があります。

ありがとう!


ああ、もう一つ。ルールエンジンとして、アクション(コマンド)の概念を含める必要があります。これらは、式が返されたときに実行されるものです。

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

だから私は次のようなルールを見る:

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

同意するのは、ワークフローではないが、ワークフローエンジンファミリの何かを使用することです。 System.Workflow.Activities.Rules 少し名前空間を調べてください。これは.Net 3でサポートされており、.Net3.5に組み込まれています。あなたが言及したようにあなたは自由に使用するためにすべてを手にしています:

  • 条件のRuleCondition、アクションのRuleAction

  • メタコードを記述するための標準化された形式(CodeDom-CodeExpressions)

  • typeProvidersを介して、あらゆる種類の複雑さをプラグインすることができます(Linqとラムダ以外の真実を伝えるために、何らかの種類の拡張メソッド)

  • インテリセンスでルールを編集するための組み込みエディターがあります

  • ルールはシリアル化可能であるため、簡単に永続化できます

  • データベーススキームに対してルールを使用する場合は、typeproviderを使用して実装することもできます。

スターターの場合: ワークフロー外でルールを使用する

追伸:私たちはそれを広範囲に使用しており、その名前空間には想像以上に多くのものがあります->完全なメタアルゴリズム言語

そして最も重要なこと:それは使いやすいです-本当に

46
Nicolai Ustinov

これは私が過去に使用したクラスです。 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
  }    
}
18
Shaun Bowe

オープンソースの.NETルールエンジンはいずれも、ルールをデータベースに保存することをサポートしていません。ルールをデータベースに保存したのは商用のものだけです。データベースから実行されるカスタムルールエンジン用のUIをいくつか作成しましたが、これを実装するのは簡単なことではありません。これが通常、この機能が無料で表示されない主な理由です。

私の知る限り、それらのどれもあなたの基準をすべて満たしていませんが、ここに私が知っているもののリストがあります:

最も単純なものはSREです
http://sourceforge.net/projects/sdsre/

ルール管理UIを持つものはNxBREです
http://www.agilepartner.net/oss/nxbre/

Drools.NETはJBOSSルールを使用します
http://droolsdotnet.codehaus.org/

私が働いたプロジェクトはすべて、社内で構築したものを使いたくなかったので、私は個人的にそれらのどれも使いませんでした。ほとんどのビジネスでは、これは非常に簡単だと考えていますが、コーディングと実装に多くの時間を浪費することになります。これは、NIH(Not Invented Here Syndrome)のルールの1つです。

8
Hector Sosa Jr

さて、論理式は数式のサブセットに過ぎないため、CodePlexで NCalc-.NET の数式評価ツールを試してみてください。

7
James Curran

これに対する公式のMSソリューションは、 Windowsワークフロー です。 「シンプル」とは言いませんが、すべての仕様を満たしています(いずれにせよ、大規模なフレームワークが必要です)。

5
Will

私はこれを使用しました http://www.codeproject.com/KB/recipes/Flee.aspx 過去に成功しました。試してみる。

4
BuddhiP

Windows Workflow Foundationは、無料のフォワードチェーン推論エンジンを提供します。そして、ワークフロー部分なしで使用できます。開発者はルールを作成および編集できます。

プログラマ以外の人にルールを編集および維持してもらいたい場合は、 Rule Manager を試してください。

ルールマネージャーは、実用的なVisual Studioソリューションを生成します。それにより、かなり早く始めることができます。 [ファイル]、[エクスポート]の順にクリックして、WFRules形式を選択します。

3
Sentient

http://www.FlexRule.com で当社の製品をご覧いただけます。

FlexRuleは、3つのエンジンをサポートするビジネスルールエンジンフレームワークです。手続き型エンジン、推論エンジン、およびRuleFlowエンジン。その推論エンジンは、Reteアルゴリズムの強化された実装を使用するフォワードチェーン推論です。

2
Arash Aghlara

Windowsワークフローを見てみます。ルールエンジンとワークフローは、単純に始まり、徐々に複雑になる傾向があります。 Windows Workflow Foundationのようなものは、始めるのがそれほど難しくなく、成長の余地を提供します。 簡単なワークフローエンジンを実行するのはそれほど難しくないことを示す投稿です

1
Brian Ellis

Logicianをご覧ください: tutorial/overview on CodeProject

プロジェクト: page/source on SourceForge

1
Eric

多分チェックアウト 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
1
Brendan Kowitz

試してみてください http://rulesengine.codeplex.com/

式ツリーで動作するC#オープンソースルールエンジンです。

1
Arnaud

私が作成したルールエンジンに基づくシンプルなオープンソース属性であるRuEnを使用できます。

http://ruen.codeplex.com

1
Bhaskar

BizTalkの親子関係から簡単に解くことができないため、無料ではありませんが、BizTalkのビジネスルールエンジンコンポーネントは、コアBizTalkエンジン自体とは別個のエンティティであり、ルール/ポリシーベースを含む非常に強力なルールエンジンを構成しますGUI。これの無料版があれば、それはあなたの要件に合うでしょう(BREのためだけにBizTalkを購入することは実際には商業的には機能しません)。

0

Lambda式(および式ツリー)を使用して何をしようとしているかに応じて、この概念で機能します。基本的に、文字列として式を提供し、その場でラムダ式/式ツリーにコンパイルされ、それを実行(評価)できます。最初は理解するのは簡単ではありませんが、一度行うと、非常に強力でセットアップがかなり簡単になります。

0
Scott Dorman