DecisionSense.Client 1.0.0

dotnet add package DecisionSense.Client --version 1.0.0
NuGet\Install-Package DecisionSense.Client -Version 1.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DecisionSense.Client" Version="1.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add DecisionSense.Client --version 1.0.0
#r "nuget: DecisionSense.Client, 1.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install DecisionSense.Client as a Cake Addin
#addin nuget:?package=DecisionSense.Client&version=1.0.0

// Install DecisionSense.Client as a Cake Tool
#tool nuget:?package=DecisionSense.Client&version=1.0.0

Decision Sense Client

Con Decision Sense, tienes a tu disposición una potente librería diseñada específicamente para facilitar la gestión y resolución de las complejas reglas de negocio. Desarrollada en .NET/.NET Core, esta herramienta te permite integrar de manera sencilla y efectiva todas las operaciones relacionadas con el manejo y la solución de estas reglas.

1. Instalación

Solo tiene que agregar al proyecto el paquete DecisionSense.Client desde nuget.

2. Agregar configuración HttpExternalApi

Los valores necesarios para la configuración se los obtiene en la apliacación Decision Sense (www.decisionsense.io) en la sección Aplicaciones.

  • ClientId
  • ClientSecret
  • TenantId

Nota La librería debe ser configurada una sola vez y puede hacerse en cualquier lugar, ser recomienda hacerlo al inicio de la aplicación como se muestra a continuación.

Para el ejemplo la configuración la agregamos en el archivo program.cs:

using OD.RuleEngine.Client.Core;
using OD.RuleEngine.Components.Client.Shared.Dto;

HttpExternalApi.SetConfigurationAsync(new SetUpConfigDto
{
    ClientId = "<ClientId>",
    ClientSecret = "<ClientSecret>",
    TenantId = "<TenantId>",
});

3. Creación Entidades

Es fundamental definir los elementos que utilizaremos para crear y evaluar nuestras reglas. Como ejemplo, vamos a crear una regla que verifique si una persona es Mayor de Edad. Para lograr esto en nuestro proyecto, necesitaremos una clase que contenga los atributos necesarios para determinar si una persona cumple con estas características, como nombres, edad, fecha de nacimiento, entre otros.

En este caso práctico, abordaremos la situación de la siguiente manera:

  • Creamos una clase que represente a la persona. En nuestro contexto, la llamaremos Client que hace referencia a la entidad en cuestión.
  • Los atributos que serán clave para evaluar si se cumple o no con la necesidad se definen como propiedades dentro de esta clase. En este caso, los atributos se llamarán Names y Age.

Importante En nuestro proyecto, si las clases y sus atributos tienen nombres diferentes a los que necesitamos para nuestra entidad y propiedades, podemos modificarlos utilizando los atributos RuleEntity y RuleField. Como ilustración, consideremos el siguiente ejemplo:

  • La clase se llama Client pero necesitamos que la entidad se identifique como "CLIENTE"
  • Los atributos de la clase Names y Age deberán reconocerse como "NOMBRES" y "EDAD"
using OD.RuleEngine.Client.Attributes;

[RuleEntity("CLIENTE")]
public class Client
{
    [RuleField(code:"NOMBRES", name:"NOMBRES", description:"LOS NOMBRES DEL CLIENTE")]
    public string Names { get; set; }
    [RuleField(code: "EDAD", name:"EDAD", description: "LA EDAD DEL CLIENTE")]
    public string Age { get; set; }
}

Los siguientes campos pueden ser configurados al crear entidades o propiedades:

  • Code: Código que actúa como identificador único (no puede repetirse).
  • Name: Nombre descriptivo que permite identificar al momento de crear una regla, es utilizado como un label.
  • Description: Descripción detallada, para obtener más información.

Consideraciones:

  • El code debe contener únicamente letras, números, '_' e iniciar con una letra ya sea mayúscula o minúscula, se sugiere utilizar un máximo de 30 caracteres.
  • El name se sugiere utilizar un máximo de 100 caracteres.
  • Agregar el detalle en cada entidad o propiedad.
  • La entidades y propiedades que se crean desde la librería no pueden ser modificadas desde el aplicativo web.
  • La librería solo crea las nuevas entidades si al cambiar el name o description no se realiza la actualización.
  • En el caso de que se modifique el code se crea una nueva entidad o propiedad y ya no haría match con las reglas creadas.

En el código anterior se observa la clase Client. Si no se especifica un código se toma el nombre de la clase o del campo de forma predeterminada.

3.1. Invocar creación de entidades

Agregamos la invocación dentro de un bloque Try/Catch para detectar excepciones.

Para el ejemplo la configuración la agregamos en el archivo program.cs:

try
{
    Task.Run(async () =>
    {
        await EntityHelper.CreateEntities(typeof(Client).Assembly);
    }).Wait();
}
catch(Exception ex)
{
    app.Logger.LogError(ex, "Se produjo un error al inicializar las entidades creadas.");
    throw;
}

Nota

  • Las entidades creadas desde Decision Sense Client son añadidas a la categoría llamada Transversal, para mayor información puede revisar Categorías
  • Para la creación toma todas las clases que se le haya agregado las anotaciones RuleEntity y RuleField.

4. Invocar Evaluación de Regla

Con las entidades y propiedades ya listas, en el aplicativo Decision Sense se debe crear la regla para lo cual se lo realiza siguiendo los pasos de: Creación Regla

Con la regla creada y publicada pasamos a realizar la evaluación:

  • Para la invocación de la evaluación hacemos uso del método EvaluatorHelper.EvaluateRules.
  • En la invocación nos permite evaluar un listado de reglas.
  • Además, si queremos evaluar la regla con un tenantId diferente podemos enviarlo como un parámetro adicional en el método EvaluatorHelper.EvaluateRules.
var itemRule = new Client
{
    Names = "Decision Sense",
    Age = "25",
};

var input = new List<EvaluateRuleInput> {
    new EvaluateRuleInput
    {
        Id=16,
        TraceId= Guid.NewGuid(),
        Values= new List<object> { itemRule }
    }
};
var evaluationResult = await EvaluatorHelper.EvaluateRules(input);
  • Id: Identificador (ID) de la regla.
  • TraceId: Un código de referencia que nos permite identificar una regla después de que fue evaluada, útil cuando se evalúan varias reglas al mismo tiempo.
  • EvaluateRuleInputString: Permite Values de tipo string en el cual se debe enviar el JSON de las entidades con el siguiente formato.
{
    "CLIENTE": {
        "NOMBRES": "Decision Sense",
        "EDAD": 25
    }
}
  • EvaluateRuleInput: Permite valores de tipo Lista de Objetos. Para que los objetos enviados sean admitidos, sus clases deben tener las anotaciones de RuleEntity y RuleField.

5. Invocar Evaluación de Tabla de Decisión

Con las entidades y propiedades ya listas, pasamos a realizar la evaluación:

  • Para la invocación de tablas de decisión hacemos uso del método EvaluatorHelper.EvaluateDecisionTable.
  • Además, si queremos evaluar la tabla de decisión con un tenantId diferente podemos enviarlo como un parámetro adicional en el método EvaluatorHelper.EvaluateDecisionTable.
var itemTable = new Client
{
    Names = "Decision Sense",
    Age = "25",
};

var inputTable = new EvaluateDecisionTableInput
{
    Id = 7,
    TraceId= Guid.NewGuid(),
    Values = new List<object> { itemTable }
};

var evaluationResult = await EvaluatorHelper.EvaluateDecisionTable(inputTable, "a74fba4a-1f39-ccd2-245a-3a11c7852dd8");

  • Id: Identificador (ID) de la tabla de decisión.
  • TraceId: Un código de referencia que nos permite identificar una tabla de decisión después de que fue evaluada, útil cuando se evalúan varias tablas de decisión al mismo tiempo.
  • EvaluateDecisionTableInputString: Permite Values de tipo string en el cual se debe enviar el JSON de las entidades con el siguiente formato.
{
    "CLIENTE": {
        "NOMBRES": "Decision Sense",
        "EDAD": 25
    }
}
  • EvaluateDecisionTableInput: Permite valores de tipo Lista de Objetos. Para que los objetos enviados sean admitidos, sus clases deben tener las anotaciones de RuleEntity y RuleField.

Nota Los métodos proporcionados por EvaluatorHelper para evaluar reglas o tablas de decisión pueden recibir:

  • Un tenantId específico para la evaluación, o utilizar el que se haya configurado por defecto en el HttpExternalApi.
  • El campo Values puede ser un texto o una lista de objetos, para mayor comodidad del usuario.
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.0 51 5/2/2024