【发布时间】:2017-06-09 18:02:10
【问题描述】:
我的想法包括两个主要元素:
- 采用 C# Dto(数据传输对象)并将其转换为 typescript 接口,以确保客户端模型与服务器端同步。
- 获取 ASP .Net 核心控制器端点并将它们转换为使用 http-service 或类似服务的 typescript 类。同样,确保客户端请求与服务器同步。
并且每当对控制器或 dto 进行更改时,打字稿生成的项目随后应刷新以在开发过程中保持同步。
我做了一些研究,发现了以下 Stack Overflow 线程和其他来源:
DTO to TypeScript generator 建议使用 TypeLite 库,这看起来很棒,但根据文档,这需要 [TsClass] 属性或启动时对类的引用。但是,由于我使用的项目结构是设置的,因此所有 dto 都位于 *.Dtos 命名空间中,所以我有点缺少 TypeScript.Definitions().ForNameSpace()。此外,这只解决了第一个想法/问题。
Swashbuckly.AspNetCore 将允许我从控制器和 dto 生成 swagger 文档,然后任务将以某种方式解释 swagger 文档并从中创建打字稿类和接口。缺点是,据我所知,这需要我启动服务器,如果可能的话,我想避免这种情况,因为这会使更新文件更改变得困难。
仅供参考,这是我即将开始的一个新项目,因此没有要更新的旧代码,而且所有 ASP .NET Core 端点都将返回 IActionResult 以启用 Ok()、BadRequest() 的返回等等。因此,在我看来,获得回报模型会很困难,因为没有简单的方法来获得它产生的 dto(如果有的话)。
所以,我想到了解决这两个问题的以下解决方案:
创建一个单独的包/应用程序,使用 Swashbuckly 库并在不启动整个服务器的情况下生成模型和控制器。
在每个端点上创建注释,类似于 [Produces(SomeDto)],之后我将创建一个小型控制台应用程序,该应用程序使用反射获取信息并从中生成打字稿。这当然需要开发人员保持这些信息同步,所以在我看来有些重复信息。
但是,这两种解决方案都不会在 C# 源文件保存时自动更新。
期待任何讨论/建议。
【问题讨论】:
-
我一直在评估类似的东西。我会警告你,如果你走 TypeLite 路径,它目前不支持 .NET Core;但是,我发现 TypeLite 是 .NET 4 中的最佳解决方案。虽然它可能不提供命名空间加载模式,但它使用递归标识来确定所有引用的属性模型。因此,如果您有一个或两个顶级模型,您可以简单地引用它们,并且所有子属性类型也将被加载到最低级别的模型。
标签: c# asp.net typescript typelite