在这篇文章中,我们将探讨如何采用最新的实践来创建一个稳健的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) 的文章。