我正在研究改装库,并评估是否值得将其集成到我的项目中。
假设我有一个Controller接受带有特定合同的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
或签名本身中的路由,这种处理方式会导致潜在的运行时错误。
问题
是否有一种方法可以从现有控制器中自动生成此接口,从而降低发生错误的风险?
答案 0 :(得分:0)
您当然可以通过使用 C# 9 Source Generators 或 Fody IL Weaving 来做到这一点。
但另一种解决方案是在 Roslyn analyzer 库之上使用带有代码修复的实时 Refit,并让它处理类型安全客户端的生成。因为与其重新发明轮子,不如节省时间和精力,在已经存在、记录、稳定和维护的东西的基础上进行构建,例如 Refit,而不是滚动您自己的实施。
为了让分析器工作,您必须在您的 web api 配置中启用按操作名称路由,并且每个控制器都必须实现其相应的 Refit 接口。
// routing by action name
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
分析器将检查路由属性中指定的路由字符串是否与方法签名匹配。如果检测到无效路由,编译器将报告编译错误并提供修复。
这样你的路由字符串就不会出错,即使你出错了,编译器也会通知你。
这是我制作的一个简单的 Refit 路由分析器的 code,它会让你很好地了解它是如何工作的。
PS:编程的第一条规则是不要重新发明轮子。
答案 1 :(得分:-1)
您只需右键单击类名,从上下文菜单中选择自定义操作,然后单击提取界面