À procura de uma biblioteca de motores de regras simples in.NET [fechado]

alguém conhece uma boa biblioteca de regras da biblioteca. net (idealmente open-source)? Eu preciso de algo que possa fazer expressões lógicas aninhadas, por exemplo, (A E B) e (B ou C ou D). Eu preciso fazer comparações de propriedades de objetos, por exemplo, A. P1 E B. P1. (Idealmente, eu poderia comparar qualquer propriedade -- A. P1 e B. P2).

ele deve armazenar as regras em um banco de dados (eu tenho um monte de lógica simples configurável). E deve ter uma API de criação de regras / gestão. A ferramenta de gestão teria de inspecionar as instâncias para determinar quais propriedades estão disponíveis e quais restrições existem.

Obrigado!


Mais uma coisa. Como um motor de regras, eu preciso incluir o conceito de ações (comandos). Estes são os que executam quando a expressão retorna:

If (expression.Evaluation) { actions.Execute(); }
Então, vejo uma regra como algo do género:
class Rule
{
    Expression Exp;
    Actions[] Actions;
    Run() 
    { 
        if(Exp.Evaluate()) 
        { 
            foreach(action in Actions) 
            { 
                action.Execute(); 
            }
        } 
    }
}
Author: Jonas W, 2008-10-16

15 answers

Concordando com o will, diria para usares algo da família de motores do fluxo de trabalho, embora não do fluxo de trabalho. Examine O Sistema Fluxo.Actividade.Regras espaço de nomes um pouco-é suportado em. Net 3, e incorporado em. Net3. 5. Você tem tudo à mão para usar gratuitamente, como mencionou :
  • Regras relativas às condições , regras relativas às acções

  • Formato normalizado para a descrição metacode (CodeDom-Codeexpressões)

  • Tu. pode plugin qualquer tipo de complexidade para isso (a verdade) LINQ e lambdas e so extension métodos de algum tipo) via Fornecedores de dactilógrafos

  • Há um editor de compilação para a regra edição com intellisense

  • Como a regra é serializável pode ser persistir facilmente

  • se pretendeu usar as regras sobre um esquema de bases de dados então via typeprovider também pode ser implementado

Para iniciador : usando regras fora de uma fluxo de trabalho

Ps.: nós estamos usando extensivamente e há muito mais nesse espaço de nomes do que você já imaginou -> uma linguagem meta algoritmo completo

E o mais importante : é fácil de usar - realmente

 46
Author: Nicolai Ustinov, 2009-03-24 16:29:33
Aqui está uma aula que usei no passado. Ele avalia strings assim como eval() faz em Javascript.
String result = ExpressionEvaluator.EvaluateToString("(2+5) < 8");

Tudo o que você precisa fazer é construir uma string para ser avaliada a partir de seus objetos de negócio e isso irá cuidar de toda a complicada lógica aninhada etc.

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
Author: Shaun Bowe, 2008-10-16 14:24:44

Nenhum motor de regras open source.NET tem suporte para armazenar regras na base de dados. Os únicos que armazenaram as regras em uma base de dados são comerciais. Eu criei alguns UIs para motores de regras personalizados que funcionam fora do banco de dados, mas isso pode ser não-trivial para implementar. Essa é geralmente a principal razão pela qual você não vai ver esse recurso de graça.

Tanto quanto sei, nenhum deles irá cumprir todos os teus critérios,mas aqui está uma lista dos que conheço:

O mais simples é SRE
http://sourceforge.net/projects/sdsre/

Um com Rule management UI é NxBRE.
http://www.agilepartner.net/oss/nxbre/

Drools.NET usa as regras JBOSS
http://droolsdotnet.codehaus.org/

Pessoalmente, não usei nenhum deles, porque todos os projectos com os quais trabalhei nunca quiseram usar algo construído em casa. A maioria dos negócios pensam que isso é muito fácil de fazer, mas acabam perdendo muito tempo codificando e implementando-o. Esta é uma daquelas áreas que a síndrome não inventada aqui (NIH) regula.
 8
Author: Hector Sosa Jr, 2008-10-16 14:15:49

Bem, dado que a expressão lógica é apenas um subconjunto de expressão matemática, poderá querer tentar Ncalc - Avaliador de Expressões Matemáticas para o.NET sobre o CodePlex.

 7
Author: James Curran, 2008-10-16 14:14:52

A solução oficial em para isto é Windows Workflow. Embora eu não o chamaria de "simples", ele atende todas as suas especificações (o que exigiria uma estrutura extensa para atender, de qualquer forma).

 5
Author: Will, 2008-10-16 14:08:37

A Fundação Windows Workflow dá-lhe um motor de inferência livre para a frente. E você pode usá-lo sem a parte do fluxo de trabalho. Criar e editar regras é ok para os desenvolvedores.

Se quiser que os não-programadores editem e mantenham as regras, poderá experimentar o Gestor de regras .

O Gestor de regras irá gerar uma solução visual studio funcional para si. Isso deve fazê-lo começar rapidamente. Basta carregar no ficheiro \ Export e seleccionar as regras WFRules formato.
 3
Author: Sentient, 2010-01-04 18:27:51

Você pode dar uma olhada no nosso produto também em http://www.FlexRule.com

FlexRule é um motor de regras de negócio com suporte para três motores; Motor de procedimento, motor de inferência e motor RuleFlow. Seu motor de inferência é uma inferência em cadeia avançada que usa a implementação melhorada do algoritmo Rete.

 2
Author: Arash Aghlara, 2011-10-07 05:09:35
Eu olhava para o fluxo de trabalho do Windows. Regras Motores e fluxo de trabalho tendem a começar simples e tornar-se progressivamente mais complexo. Algo como a Fundação Workflow do Windows não é muito difícil de começar e proporciona espaço para o crescimento. Aqui está um post que mostra que não é muito difícil ter um motor de fluxo de trabalho simples funcionando.
 1
Author: Brian Ellis, 2009-03-24 16:41:26

Talvez verSmartRules . Não é livre, mas a interface parece simples o suficiente.

Só sei disso Porque já usei o utilitário de códigos de código inteligente de lá antes.

Aqui está uma regra de exemplo do Site:

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
Author: Brendan Kowitz, 2009-06-01 01:43:04

Pode usar um RuEn, um simples motor de regras baseado em atributos abertos criado por mim:

Http://ruen.codeplex.com

 1
Author: Bhaskar, 2010-01-28 08:37:22

Experimenta. http://rulesengine.codeplex.com/

É um motor C# Open-Source que funciona com árvores de expressão.
 1
Author: Arnaud, 2011-09-07 06:01:14

Veja o Lógico: tutorial / overview no CodeProject

Project: page / source on SourceForge

 1
Author: Eric, 2011-10-27 02:20:53

Dependendo do que você está tentando fazer usando expressões Lambda (e árvores de expressão) pode funcionar para este conceito. Essencialmente, você fornece uma expressão como uma cadeia que é então compilada na mosca em uma árvore de expressão/expressão lambda, que você pode então executar (avaliar). Não é simples de entender no início, mas uma vez que você faz é extremamente poderoso e bastante simples de configurar.

 0
Author: Scott Dorman, 2008-10-16 14:52:42
[[1]} não é livre, como você não pode facilmente desembaraçá-lo de sua filiação BizTalk, mas as regras de Negócio componentes de motor da BizTalk são uma entidade separada do motor principal BizTalk em si, e compreendem um motor de regras muito poderoso que inclui uma GUI baseada em regras / políticas. Se houvesse uma versão livre disso, ele se encaixaria em seus requisitos (comprar BizTalk apenas para o BRE realmente não funcionaria comercialmente.)
 0
Author: Hugo Rodger-Brown, 2009-12-21 15:57:16