如何从现有的控制器自动生成改装接口?

时间:2018-10-17 15:28:54

标签: c# asp.net-core refit

我正在研究改装库,并评估是否值得将其集成到我的项目中。

假设我有一个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或签名本身中的路由,这种处理方式会导致潜在的运行时错误。

问题

是否有一种方法可以从现有控制器中自动生成此接口,从而降低发生错误的风险?

2 个答案:

答案 0 :(得分:0)

您当然可以通过使用 C# 9 Source GeneratorsFody 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)

您只需右键单击类名,从上下文菜单中选择自定义操作,然后单击提取界面