四川纵川建设机械有限公司网站,网站建站网站,网页制作素材十个跳转页面,wordpress chastity前言极客时间上的《.NET Core开发实战》是一门非常好的课程#xff0c;作者肖伟宇在第31课#xff08;https://time.geekbang.org/course/detail/100044601-201165#xff09;介绍了定义API的最佳实践。大意如下#xff1a;Controller这一层负责与前端用户的交互#xff0… 前言极客时间上的《.NET Core开发实战》是一门非常好的课程作者肖伟宇在第31课https://time.geekbang.org/course/detail/100044601-201165介绍了定义API的最佳实践。大意如下Controller这一层负责与前端用户的交互它主要的责任就是定义输入和输出不应该处理业务。 因此使用中介者模式将业务逻辑和Controller进行隔离。示例API的实现代码如下[Route(api/[controller])]
[ApiController]
public class OrderController : ControllerBase
{IMediator _mediator;public OrderController(IMediator mediator){_mediator mediator;}[HttpPost]public async Tasklong CreateOrder([FromBody]CreateOrderCommand cmd){return await _mediator.Send(cmd, HttpContext.RequestAborted);}[HttpGet]public async TaskListstring QueryOrder([FromQuery]MyOrderQuery myOrderQuery){return await _mediator.Send(myOrderQuery);}
}public class CreateOrderCommand : IRequestlong
{public CreateOrderCommand(int itemCount){ItemCount itemCount;}public long ItemCount { get; private set; }
}public class MyOrderQuery : IRequestListstring
{public string UserName { get; set; }
}
问题按照上述的最佳实践去编写Controller这就意味着如果有100个命令和查询就要创建100个同样格式的方法。这是一项重复并且枯燥的工作而且还必须保证方法返回值与IRequestT的类型一致很容易出错。有不有不用写这些代码的简单方式Source Generators现在可以祭出我们的大杀器——Source Generators。上次我们已经使用它实现了AutoMapper它的主要特点是自动生成源代码并编译到最终输出中。这次我们用它来自动生成API代码。实现原理如下遍历所有继承IRequestT的类并用它们名称的第2个单词例如Order分组分组Key作为Controller的名称在Controller分组中遍历分组下的类生成对应命令和查询方法具体实现代码请到https://github.com/feiyun0112/CodesForMy_IO下载。使用示例下载课件代码https://gitee.com/geektime-geekbang/NET-Core在GeekTime.Ordering.API项目中引用ApiControllerGenerator项目无需修改任何代码直接编译可以看到已经按照最佳实践的规范生成了代码Controller名称故意加了New以示区别运行后Swagger显示正常成功结论现在我们只需定义命令和查询即可实现定义API的最佳实践是不是很酷如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“记住我