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 方案。