Filtern | Sortieren | Stolzieren
SieveFramework ist ein hochgradig anpassbares Framework, das die einfachere Integration von Filtern, Sortierungen und Paginierung in Ihr Projekt mit ausreichender Abstraktionsebene erleichtert. Unter der Haube befindet sich System.Linq.Expressions
das dabei hilft, beliebige Vorgänge mit Sammlungen auszuführen und native Unterstützung für Abfragen zu erhalten.
Projekt | Beschreibung |
---|---|
SieveFramework | Kernprojekt mit Basisfunktionalität |
SieveFramework.AspNetCore | Erforderliche Abhängigkeiten zur Integration von Sieve in ASP.Net Core-Projekte |
SieveFramework.AspNetCore.Swashbuckle | Erforderliche Abhängigkeiten zur Integration von Sieve in das Swagger-Framework |
Der Hauptanbieter ist SieveProvider
. Es enthält lediglich eine Sammlung von ModelProvider
, die die Informationen zu einem konkreten Modell speichert:
Der Hauptanbieter arbeitet mit Prädikaten – Sammlungen von Aktionen unter einer abfragbaren Ressource. Jedes Prädikat kann nur eine Art von Abfrageaktion unter der Ressource ausführen:
Dieses Design hilft dabei, die gleiche Art von Vorgängen an einen Ausführenden zu delegieren und steuert die Richtung der Vorgänge in der Pipeline.
Das von Parsern dargestellte Filterformat, das zum Binden von Abfrageanforderungen mithilfe eines benutzerdefinierten Modellbinders verwendet wird.
[!] Daten aus dem Hauptteil der Anfrage werden mit nativen ASP.Net-Modellbindern gebunden.
Konfiguration des standardmäßigen nativen Parsers:
Alias | Beschreibung |
---|---|
~ | NODE_DELIMITER – wird zum Aufteilen von Werten innerhalb des Knotens verwendet |
& | OPERATION_DELIMITER – wird zum Aufteilen verschiedener Vorgänge verwendet (Standardabfragesplitter) |
filter= | FILTER – Abfrageparameter enthält Filter |
sort= | SORT – Abfrageparameter enthält Sortierungen |
take= | TAKE – Abfrageparameter enthält Auswahlgröße |
skip= | SKIP – Abfrageparameter enthält die Größe des Überspringens |
Die geplante Funktion ist das DeepObject-Swagger-Format zur Deserialisierung des abzufragenden Modells.
Struktur: Property
NODE_DELIMITER
Alias
NODE_DELIMITER
Value
Alias (nativ) | Alias (DeepObject) | Beschreibung |
---|---|---|
eq | TODO | Gleich |
neq | TODO | Nicht gleich |
gt | TODO | Größer als |
gte | TODO | Größer oder gleich |
lt | TODO | Weniger als |
lte | TODO | Kleiner oder gleich |
Struktur: Filter
NODE_DELIMITER
Alias
NODE_DELIMITER
Filter
Alias (nativ) | Alias (DeepObject) | Beschreibung |
---|---|---|
and | TODO | Verkettet Filter nach und Logik |
or | TODO | Verkettet Filter nach Logik |
Der Filter wird zuerst durch
or
Bedingung abgeleitet, sodassnode
~and
~node
~or
~node
(node
~and
~node
)~or
~node
sein werden.
Struktur: Property
NODE_DELIMITER
Alias
Alias (nativ) | Alias (DeepObject) | Beschreibung |
---|---|---|
asc | TODO | Aufsteigend sortieren |
desc | TODO | Absteigend sortieren |
Sortierknoten dürfen nur mit
and
Logik verkettet werden:
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"
} ) ;
} ) ;
}
Siebbeschreibungen füllen das Swagger-Schema mit einem stark typisierten Siebmodell und einer Liste der zulässigen Sortier- und Filtereigenschaften für jede API-Aktion.