Filtrado | Clasificación | Pavonearse
SieveFramework es un marco altamente personalizable que ayuda a integrar más fácilmente filtros, clasificaciones y paginación a su proyecto con suficiente nivel de abstracción. Debajo del capó se encuentra System.Linq.Expressions
ayuda a realizar cualquier operación con colecciones y obtener soporte nativo para consultas.
Proyecto | Descripción |
---|---|
SieveFramework | Proyecto central con funcionalidad básica. |
SieveFramework.AspNetCore | Dependencias necesarias para integrar Sieve en proyectos ASP.Net Core |
SieveFramework.AspNetCore.Swashbuckle | Dependencias necesarias para integrar sieve con el marco Swagger |
El proveedor principal es SieveProvider
. Simplemente contiene una colección de ModelProvider
que mantiene la información sobre un modelo concreto:
El proveedor principal trabaja con predicados: colecciones de acciones bajo un recurso consultable. Cada predicado puede realizar solo un tipo de acción de consulta en el recurso:
Este diseño ayuda a delegar el mismo tipo de operaciones a un ejecutor y controla la dirección de las operaciones en el proceso.
Formato de filtro presentado por analizadores y utilizado para vincular desde una solicitud de consulta mediante un enlazador de modelos personalizado.
[!] Los datos del cuerpo de la solicitud se vincularán con carpetas de modelos nativos de ASP.Net.
Configuración del analizador nativo predeterminado:
Alias | Descripción |
---|---|
~ | NODE_DELIMITER : utilizado para dividir valores dentro del nodo |
& | OPERATION_DELIMITER : se utiliza para dividir diferentes operaciones (divisor de consultas predeterminado) |
filter= | FILTER : el parámetro de consulta contiene un filtro |
sort= | SORT : el parámetro de consulta contiene tipos |
take= | TAKE : el parámetro de consulta contiene el tamaño de la selección |
skip= | SKIP : el parámetro de consulta contiene el tamaño de omisión |
La característica planificada es el formato Swagger de DeepObject para deserializar el modelo para consultar.
Estructura: Property
NODE_DELIMITER
Alias
NODE_DELIMITER
Value
Alias (nativo) | Alias (objeto profundo) | Descripción |
---|---|---|
eq | HACER | igual a |
neq | HACER | No igual a |
gt | HACER | Más que |
gte | HACER | Mayor o igual que |
lt | HACER | Menos que |
lte | HACER | Menor o igual |
Estructura: Filter
NODE_DELIMITER
Alias
Filter
NODE_DELIMITER
Alias (nativo) | Alias (objeto profundo) | Descripción |
---|---|---|
and | HACER | Concatena filtros por lógica y |
or | HACER | Concatena filtros por lógica o |
Filtre derivado en primer lugar por
or
condición para quenode
~and
~node
~or
~node
sean (node
~and
~node
) ~or
~node
.
Estructura: Property
NODE_DELIMITER
Alias
Alias (nativo) | Alias (objeto profundo) | Descripción |
---|---|---|
asc | HACER | Ordenar ascendente |
desc | HACER | Ordenar descendente |
Los nodos de clasificación sólo pueden concatenarse con
and
lógica:
node
~and
~node
public void ConfigureServices ( IServiceCollection services )
{
services . AddSieveProvider ( config =>
{
// WithParser - Add custom Query parser. [NativeQueryParser] is default, no need to register them it's just an example
config . WithParser < NativeQueryParser > ( )
// ForAssemblies - Add assemblies to scan models by attributes [CanSort / CanFilter]
. ForAssemblies ( .. . )
// Fluent models registration
. ConfigureProvider ( provider =>
{
provider . AddModel < TestModel > ( builder =>
{
builder . CanSort ( p => p . TestProperty ) ;
builder . CanFilter ( p => p . TestProperty ) ;
} ) ;
} ) ;
} ) ;
services . AddControllers ( ) ;
}
public class WeatherForecastController : ControllerBase
{
// [1] Accept processor through DI
private readonly ISieveProvider _sieve ;
public WeatherForecastController ( ISieveProvider sieve )
{
_sieve = sieve ;
}
// [2] Wrap processed model's resource with [Sieve] - It will be maped automaticly
[ HttpGet ]
public ActionResult GetCustom ( Sieve < WeatherForecast > model )
{
var rng = new Random ( ) ;
var query = Enumerable . Range ( 1 , 5 ) . Select ( index => new WeatherForecast
{
Date = DateTime . Now . AddDays ( index ) ,
TemperatureC = rng . Next ( - 20 , 55 ) ,
Summary = "Summary" + index
} ) . AsQueryable ( ) ;
// [3] Apply filter to resource
var result = _sieve . Apply ( query , model ) . ToArray ( ) ;
return Ok ( new
{
origin = query . ToArray ( ) ,
result = result
} ) ;
}
}
public void ConfigureServices ( IServiceCollection services )
{
// [1] Must be registered before swagger
services . AddSieveProvider ( ) ;
services . AddControllers ( ) ;
services . AddSwaggerGen ( builder =>
{
// [2] Add configuration for swagger
services . AddSieveDescription ( builder ) ;
builder . SwaggerDoc ( "v1" , new OpenApiInfo
{
Title = "Test" ,
Version = "v1"
} ) ;
} ) ;
}
Las descripciones de los tamices completan el esquema de arrogancia con un modelo de tamiz de tipo fuerte y una lista de propiedades permitidas para ordenar y filtrar para cada acción de API.