手记

ASP.NET Core Web API 使用 Gridify 实现高级过滤功能指南

前言

在这篇文章中,我们将探讨如何采用最新的实践来创建一个稳健的ASP.NET Core Web API,包括依赖注入等,并通过控制器、服务层和仓储层来结构化应用。我们还将集成Gridify NuGet包,以演示在多种使用场景下的高级过滤功能,所有这些功能都在相同的路由下实现。

Gridify:一个现代动态 LINQ NuGet 包 — 图片来自 GitHub,LINQ 是 Language Integrated Query 的缩写。

项目设置

创建一个新的 ASP.NET Core Web API 项目。

请在命令行中输入以下命令来创建一个新的Web API项目并进入项目目录:

dotnet new webapi -n GridifyAdvancedDemo  
cd GridifyAdvancedDemo

安装所需的NuGet包,如 Gridify 和其他所需的包。

    在 dotnet 中添加包, Gridify  
    在 dotnet 中添加包, Microsoft.EntityFrameworkCore  
    在 dotnet 中添加包, Microsoft.EntityFrameworkCore.InMemory
项目结构和依赖注入(DI)

定义您的模型,

// 商品类
public class 商品  
{  
    public int Id { get; set; }  
    public string 品名 { get; set; }  
    public decimal 价格 { get; set; }  
    public string 分类 { get; set; }  
}

设置存储层:

public interface IProductRepository  
{  
    IQueryable<Product> 获取产品列表();  
}  

public class ProductRepository : IProductRepository  
{  
    private readonly List<Product> _products;  

    public ProductRepository()  
    {  
         // 示例产品数据  
        _products = new List<Product>  
        {  
            new Product { Id = 1, Name = "产品A", Price = 10.99m, 类 = "类1" },  
            new Product { Id = 2, Name = "产品B", Price = 20.99m, 类 = "类2" },  
            // 添加更多产品条目  
        };  
    }  

    public IQueryable<Product> 获取产品列表()  
    {  
        return _products.AsQueryable();  
    }  
}

创建服务层的部分:

public interface IProductService  
{  
    // 获取满足条件的产品列表
    IQueryable<Product> GetFilteredProducts(GridifyQuery gridifyQuery);  
}  

public class ProductService : IProductService  
{  
    // 私有属性,表示产品仓储接口
    private readonly IProductRepository _productRepository;  

    // 构造函数,初始化产品仓储接口
    public ProductService(IProductRepository productRepository)  
    {  
        _productRepository = productRepository;  
    }  

    // 根据网格查询获取满足条件的产品列表
    public Paging<Product> GetFilteredProducts(GridifyQuery gridifyQuery)  
    {  
        // 获取产品列表,并应用过滤、排序和分页
        var products = _productRepository.GetProducts()  
          .ApplyFiltering(gridifyQuery)  
          .ApplyOrdering(gridifyQuery)  
          .ApplyPaging(gridifyQuery.Page, gridifyQuery.PageSize);  

        // 返回产品列表
        return products;  
    }  
}
// GridifyQuery: 网格查询对象

**安装控制器:**
[ApiController]  // 标记当前控制器为API控制器
[Route("api/[controller]")]  // 设置API路由
public class ProductsController : ControllerBase  // 产品控制器类,处理与产品相关的API请求
{  
    private readonly IProductService _productService;  

    public ProductsController(IProductService productService)  // 构造函数,接收并初始化产品服务
    {  
        _productService = productService;  
    }  

    [HttpGet]  // 标记该方法为HTTP GET请求处理方法
    public IActionResult GetProducts([FromQuery] GridifyQuery gridifyQuery)  // 获取产品列表,根据查询参数进行筛选
    {  
        var products = _productService.GetFilteredProducts(gridifyQuery);  
        return Ok(products);  
    }  
}

在‘`Program.cs`’中设置依赖注入:

var builder = WebApplication.CreateBuilder(args); // 创建一个 WebApplication 构建器

builder.Services.AddSingleton<IProductRepository, ProductRepository>(); // 单例注册产品仓库
builder.Services.AddScoped<IProductService, ProductService>(); // 作用域注册产品服务
builder.Services.AddControllers(); // 添加控制器服务

var app = builder.Build(); // 构建应用

app.UseHttpsRedirection(); // 使用 HTTPS 重定向
app.UseAuthorization(); // 使用授权
app.MapControllers(); // 映射控制器
app.Run(); // 运行应用


# Gridify 的应用场景

现在,让我们来看看五个不同的情况,在这些情况下,我们使用相同的`GET /api/products`路径并使用不同的Gridify过滤条件。

## 示例 1:基本按类别筛选

**请求:**

GET /api/products?filter=分类==分类1


该请求筛选类别为`Category1`的产品。

## 场景 2:按价格筛选并排序

**请求如下:**

GET /api/products?filter=价格>15&排序=价格


此查询筛选出价格超过15的产品,并按照`Price`升序排列。

## 用例 3:带每页大小的分页功能

**请求如下:**
 GET /api/products?page=1&pageSize=2

该请求分页显示结果,每页显示两个产品,这里显示的是前两页。

## 示例 4:结合过滤、排序以及分页

**我有个请求:**
 GET /api/products?filter=Category=Category2&sort=Name&page=2&pageSize=1

这个例子通过`Category2`来筛选产品,过滤并按照`Name`排序,返回每页只显示一个产品的第二页的结果。

## 用例5:使用多个条件进行高级过滤

**请求:**

GET /api/products?filter=(分类='Category1'|价格>'50'),名称=*B



这个查询会返回属于“Category1”或价格超过50的产品,且名称中有字母“B”。

Gridify的文档可以在这里查看。点击这里访问文档。[here](https://alirezanet.github.io/Gridify/example/api-controller)。

上述用例显示了如何通过合理分层和依赖注入,既能最大化Gridify的潜力,又能保持代码的简洁和可维护性。

希望这些信息对你来说很有帮助。🌟 祝你有一个既愉快又有收获的学习旅程!

📚 更多这样的见解,可以 👍 关注 👉 [**Merwan Chinta**](https://medium.com/@merwan01) 的文章。
0人推荐
随时随地看视频
慕课网APP