68

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

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

ありがとう!


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

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

したがって、ルールは次のようになります。

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

15 に答える 15

46

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

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

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

  • TypeProvidersを介して、あらゆる種類の複雑さをそれにプラグインできます(実を言うと、Linqとラムダ、およびある種の拡張メソッドを除く)。

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

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

  • データベーススキームでルールを使用するつもりなら、typeprovider を介して実装することもできます

手始めに : ワークフロー外でルールを使用する

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

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

于 2009-03-24T16:29:33.873 に答える
18

これは私が過去に使用したクラスです。これは、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
  }    
}
于 2008-10-16T14:24:44.537 に答える
8

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

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

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

ルール管理UIを備えたものはNxBREhttp ://www.agilepartner.net/oss/nxbre/です

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

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

于 2008-10-16T14:15:49.407 に答える
7

論理式は数式のサブセットにすぎないため、CodePlexでNCalc-Mathematical Expressions Evaluatorfor.NETを試してみることをお勧めします。

于 2008-10-16T14:14:52.840 に答える
5

このための公式のMSソリューションはWindowsワークフローです。「シンプル」とは言いませんが、すべての仕様を満たしています(とにかく、満たすには広範なフレームワークが必要になります)。

于 2008-10-16T14:08:37.037 に答える
4

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

于 2011-10-27T02:18:07.937 に答える
3

Windows Workflow Foundation は無料のフォワード チェーン推論エンジンを提供します。また、ワークフロー部分がなくても使用できます。ルールの作成と編集は、開発者にとって問題ありません。

プログラマー以外の人にルールを編集して維持してもらいたい場合は、 Rule Managerを試すことができます。

ルール マネージャーは、機能するビジュアル スタジオ ソリューションを生成します。これで、すぐに始められるはずです。ファイル\エクスポートをクリックして、WFRules形式を選択するだけです。

于 2010-01-04T18:27:51.817 に答える
2

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

FlexRule は、3 つのエンジンをサポートするビジネス ルール エンジン フレームワークです。手続き型エンジン、推論エンジン、RuleFlow エンジン。その推論エンジンは、Rete Algorithm の拡張実装を使用するフォワード チェーン推論です。

于 2011-10-07T05:09:35.830 に答える
1

Logicianをご覧ください:CodeProjectのチュートリアル/概要

プロジェクト:SourceForgeのページ/ソース

于 2011-05-17T14:41:15.470 に答える
1

http://rulesengine.codeplex.com/を試す

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

于 2011-09-07T06:01:14.100 に答える
1

Windows ワークフローを検討します。ルール エンジンとワークフローは、最初は単純で、次第に複雑になる傾向があります。Windows Workflow Foundation のようなものは、始めるのが難しくなく、成長の余地があります。 これは、単純なワークフロー エンジンを動かすのはそれほど難しくないことを示す投稿です。

于 2009-03-24T16:41:26.823 に答える
1

私が作成した単純なオープン ソースの属性ベースのルール エンジンである RuEn を使用できます。

http://ruen.codeplex.com

于 2010-01-28T08:37:22.737 に答える
0

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

于 2008-10-16T14:52:42.813 に答える
0

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

于 2009-12-21T15:57:16.177 に答える