Estrutura da peneiraFiltragem | Classificação | Arrogância
SieveFramework é um framework altamente personalizável que ajuda a integrar mais facilmente Filtros, Classificações e Paginação ao seu projeto com nível de abstração suficiente. Nos bastidores está System.Linq.Expressions que ajuda a realizar qualquer operação com coleções e obter suporte nativo para consultas.
| Projeto | Descrição |
|---|---|
SieveFramework | Projeto principal com funcionalidade básica |
SieveFramework.AspNetCore | Dependências necessárias para integrar o Sieve aos projetos ASP.Net Core |
SieveFramework.AspNetCore.Swashbuckle | Dependências necessárias para integrar o Sieve com a estrutura Swagger |
O principal provedor é SieveProvider . Ele contém apenas uma coleção de ModelProvider que mantém as informações sobre um modelo concreto:
O provedor principal trabalha com predicados – coleções de ações sob um recurso consultável. Cada predicado pode realizar apenas um tipo de ação de consulta no recurso:
Esse design ajuda a delegar o mesmo tipo de operações a um executor e controla a direção das operações no pipeline.
Formato do filtro apresentado pelos analisadores e usado para vincular a solicitação de consulta usando um associador de modelo personalizado.
[!] Os dados do corpo da solicitação serão vinculados aos fichários de modelo ASP.Net nativos.
Configuração do analisador nativo padrão:
| Alias | Descrição |
|---|---|
~ | NODE_DELIMITER - usado para dividir valores dentro do nó |
& | OPERATION_DELIMITER - usado para dividir operações diferentes (divisor de consulta padrão) |
filter= | FILTER - parâmetro de consulta contém filtro |
sort= | SORT - o parâmetro de consulta contém classificações |
take= | TAKE - o parâmetro de consulta contém o tamanho da seleção |
skip= | SKIP - o parâmetro de consulta contém o tamanho do salto |
O recurso planejado é o formato swagger do DeepObject para desserializar o modelo para consulta.
Estrutura: Property NODE_DELIMITER Alias NODE_DELIMITER Value
| Alias (Nativo) | Alias (DeepObject) | Descrição |
|---|---|---|
eq | PENDÊNCIA | Igual a |
neq | PENDÊNCIA | Não é igual a |
gt | PENDÊNCIA | Maior que |
gte | PENDÊNCIA | Maior ou igual |
lt | PENDÊNCIA | Menor que |
lte | PENDÊNCIA | Menor ou igual |
Estrutura: Filter NODE_DELIMITER Alias Filter NODE_DELIMITER
| Alias (Nativo) | Alias (DeepObject) | Descrição |
|---|---|---|
and | PENDÊNCIA | Concatena filtros por e lógica |
or | PENDÊNCIA | Concatena filtros por ou lógica |
Filtro derivado primeiramente por
orcondição para quenode~and~node~or~nodeseja (node~and~node)~or~node.
Estrutura: Property NODE_DELIMITER Alias
| Alias (Nativo) | Alias (DeepObject) | Descrição |
|---|---|---|
asc | PENDÊNCIA | Classificar por ordem crescente |
desc | PENDÊNCIA | Classificar por ordem decrescente |
Os nós de classificação podem ser concatenados apenas com lógica
and:
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"
} ) ;
} ) ;
}As descrições da peneira preenchem o esquema de swagger com o modelo da peneira de tipo forte e a lista de propriedades permitidas para classificação e filtragem para cada ação da API.