我正在调查改装库并评估我是否值得集成到我的项目中。
假设我有一个控制器,它接受具有特定协定的POST
消息:
[Route("api/[controller]")]
[ApiController]
public class KeepAliveController : ControllerBase
{
[HttpPost]
public IActionResult Post(KeepAliveContract keepAliveContract)
{
//
}
}
根据我从refit
文档中了解到的内容,我必须创建一个接口。我们称之为IKeepAliveService
.它看起来像这样:
public interface IKeepAliveService
{
[Post("api/keepalive")]
Task SendKeepAliveAsync(KeepAliveContract keepAliveContract);
}
如果我弄乱了PostAttribute
或签名本身中的路由,这种做事方式会导致潜在的运行时错误。
问题
有没有办法从现有控制器自动生成此接口,从而降低错误的风险?
当然,您可以使用 C# 9 源生成器或 Fody IL 编织来执行此操作。
但另一种解决方案是在 Refit 库之上使用带有代码修复的实时 Roslyn 分析器,并让它处理类型安全客户端的生成。 因为与其重新发明轮子,为什么不节省时间和精力,并在已经存在、记录、稳定和维护的东西(如 Refit(的基础上进行构建,而不是滚动自己的实施。
为了使分析器正常工作,您必须在 Web API 配置中按操作名称启用路由,并且每个控制器都必须实现其相应的 Refit 接口。
// routing by action name
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
分析器将检查路由属性中指定的路由字符串是否与方法签名匹配。 如果检测到无效路由,编译器将报告编译错误并提供修复。
这样,您的路由字符串中永远不会出错,即使您这样做,编译器也会立即通知您!!
这是我制作的简单 Refit 路由分析器的代码,因此您不必这样做,它完全符合我的描述,我已经尝试过并且效果很好,所以请随意自定义它您想要的任何方式!
PS:编程的第一条规则是不要重新发明轮子。
有一个工具(仅限win(可以安装它,然后您可以通过cmd生成改装界面。 https://github.com/Dreamescaper/GenerateAspNetCoreClient
我需要同样的东西,所以我构建了一个名为Refitter的工具,该工具从OpenAPI规范文件生成接口和合约。
OpenAPI 规范文件可以通过在 ASP.NET Core 项目上启用 Swagger 和 SwaggerUI 来生成
因为我懒得离开Visual Studio来生成代码,所以我还构建了一个名为REST API客户端代码生成器的Visual Studio扩展,它允许我右键单击调用API的客户端系统中的OpenAPI规范文件。
您只需右键单击类名称,从上下文菜单中选择自定义操作,然后单击提取界面