SieveFramework
1.0.0
篩框架過濾|排序|昂首闊步
SieveFramework 是一個高度可自訂的框架,有助於更輕鬆地將篩選器、排序和分頁整合到具有足夠抽象層級的專案中。在底層, System.Linq.Expressions有助於實現任何集合操作並獲得對查詢的本機支援。
| 專案 | 描述 |
|---|---|
SieveFramework | 具有基本功能的核心項目 |
SieveFramework.AspNetCore | 將 sieve 整合到 ASP.Net Core 專案所需的依賴項 |
SieveFramework.AspNetCore.Swashbuckle | 將 sieve 與 Swagger 框架整合所需的依賴項 |
主要提供者是SieveProvider 。它只包含ModelProvider的集合,用於保存有關具體模型的資訊:
主要提供者使用謂詞 - 可查詢資源下的運算集合。每個謂詞只能在資源下執行一種類型的查詢操作:
這種設計有助於將相同類型的操作委託給一個執行器,並控制管道中操作的方向。
過濾器的格式由解析器呈現,並用於使用自訂模型綁定器來綁定查詢請求。
[!] 請求內文中的資料將與本機 ASP.Net 模型綁定程式綁定。
預設本機解析器的配置:
| 別名 | 描述 |
|---|---|
~ | NODE_DELIMITER - 用於分割節點內的值 |
& | OPERATION_DELIMITER - 用於分割不同的操作(預設查詢分割器) |
filter= | FILTER - 查詢參數包含過濾器 |
sort= | SORT - 查詢參數包含排序 |
take= | TAKE - 查詢參數包含選擇大小 |
skip= | SKIP - 查詢參數包含跳過大小 |
計劃的功能是 DeepObject swagger 格式,用於反序列化模型以進行查詢。
結構: Property NODE_DELIMITER Alias NODE_DELIMITER Value
| 別名(本地) | 別名(DeepObject) | 描述 |
|---|---|---|
eq | 待辦事項 | 等於 |
neq | 待辦事項 | 不等於 |
gt | 待辦事項 | 大於 |
gte | 待辦事項 | 大於或等於 |
lt | 待辦事項 | 少於 |
lte | 待辦事項 | 小於或等於 |
結構: Filter NODE_DELIMITER Alias NODE_DELIMITER Filter
| 別名(本地) | 別名(DeepObject) | 描述 |
|---|---|---|
and | 待辦事項 | 按和邏輯連接過濾器 |
or | 待辦事項 | 按下or邏輯連接過濾器 |
首先透過
or條件導出過濾器,因此node~and~node~or~node將是 (node~and~node)~or~node。
結構: Property NODE_DELIMITER Alias
| 別名(本地) | 別名(DeepObject) | 描述 |
|---|---|---|
asc | 待辦事項 | 按升序排序 |
desc | 待辦事項 | 按降序排序 |
排序節點只能與
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"
} ) ;
} ) ;
}篩子描述使用強類型篩子模型以及允許對每個 API 操作進行排序和過濾的屬性清單來填充 swagger 方案。