继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

POPMUISE
关注TA
已关注
手记 391
粉丝 80
获赞 424
前言

在这篇文章中,我们将探讨如何采用最新的实践来创建一个稳健的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) 的文章。
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP