¿Cómo diseñar un motor de reglas?
-
01-07-2019 - |
Pregunta
Se supone que debo crear un motor de reglas simple en C#.¿Alguna pista sobre cómo puedo proceder?Es un motor de reglas minimalista y usaría el servidor SQL como back-end.¿Tenemos algún plan general o patrón de diseño que generalmente se aplique a los motores de reglas?¿Qué tipo de tecnologías .Net puedo utilizar para diseñar uno?Cualquier dirección sería útil.Gracias.
Solución
Si está utilizando .NET 3.0 o posterior, puede utilizar el motor de reglas de Windows Workflow Foundation sin tener que utilizar Workflow en realidad.
Hice esto en un proyecto y puedes usar SQL o XML como backend y funciona muy bien.Puede utilizar el IDE que viene con los ejemplos de flujo de trabajo y ponerlo en sus propias aplicaciones.Es excelente.
Otros consejos
No puedo creer que implementes el tuyo propio considerando que hay tantos disponibles comercialmente y de código abierto.
Recomiendo echarle un vistazo a InRule como una excelente opción comercial a un precio razonable, o a NxBRE en el espacio de código abierto.
También puedes probarhttp://rulesengine.codeplex.com/
¿Qué tipo de motor de reglas estás buscando?¿Para prácticas de estilismo?Si es así, ve a ver EstiloCop.No es la respuesta, pero es posible que ya haya algo para usted.
¿Se le da alguna indicación sobre el método?(es decir, si esto se complementa con material del curso, ¿qué estás aprendiendo actualmente?) Si se trata de un sistema bastante básico, es posible que tengas éxito investigando Máquina determinista de estados finitos y Máquina de estados finitos no determinista
Si tiene analistas de negocios para programar el motor de reglas de alto nivel, entonces está bien: elija uno de los motores de reglas mencionados anteriormente o implemente el suyo propio (incluidos los flujos de trabajo).Si no es así, simplemente codifique su lógica de negocios en código y si alguna vez necesita contratar analistas de negocios y rehacer el sistema, está en un buen lugar para hacerlo.
Si desea escribir su implementación algo como esto...
[TestMethod]
public void GreaterThanRule_WhenGreater_ResultsTrue()
{
// ARRANGE
int threshold = 5;
int actual = 10;
// ACT
var integerRule = new IntegerGreaterThanRule();
integerRule.Initialize(threshold, actual);
var integerRuleEngine = new RuleEngine<int>();
integerRuleEngine.Add(integerRule);
var result = integerRuleEngine.MatchAll();
// ASSERT
Assert.IsTrue(result);
}
...o esto...
[TestMethod]
public void GreaterThanRule_WhenGreater_ResultsTrue()
{
// ARRANGE
int threshold = 5;
int actual = 10;
// ACT
var integerRule = new IntegerGreaterThanRule(threshold);
var integerRuleEngine = new RuleEngine<int>();
integerRuleEngine.ActualValue = actual;
integerRuleEngine.Add(integerRule);
// Get the result
var result = integerRuleEngine.MatchAll();
// ASSERT
Assert.IsTrue(result);
}
...Entonces quizás consultes mi motor de reglas simple aquí: http://www.duanewingett.info/2015/01/21/SimpleCRuleEnginePart1TheRuleEngine.aspx