9

我正在调查改装库并评估我是否值得集成到我的项目中。

假设我有这个控制器,它接受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如果我弄乱了签名本身或签名本身中的路由,这种做事方式会导致潜在的运行时错误。

问题

有没有办法从现有的控制器中自动生成这个接口,从而降低错误的风险?

4

2 回答 2

1

您当然可以使用C# 9 Source GeneratorsFody IL Weaving 来做到这一点。

但另一个解决方案是在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:编程的第一条规则是不要重新发明轮子。

于 2021-02-10T17:02:02.000 回答
-3

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

于 2018-12-04T18:18:53.037 回答