swagger nswag生成的客户端项目的循环依赖性问题

t9eec4r0  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(68)

我有一个使用Swashbuckle.AspNetCore包的ASP.NET Core 7 Web API项目。我的目标是使用其OpenAPI规范JSON文件为该服务生成客户端类,并将其作为客户端nuget包发布。
我现在做的方法如下:
1.在Web API项目中定义了一个自定义目标,它实际上是运行dotnet swagger tofile以生成swagger.json文件(这是OpenAPI规范)。
1.第二个项目,本质上是一个空项目,包含一个自定义目标,用于运行nswag run,以从前面的swagger.json文件生成客户端代码。此项目具有指向第一个项目的ProjectReference,以强制其首先运行(所以我总是有一个更新的swagger.json)。它还使用PrivateAssets="all"来避免Web API程序集被包含在从它生成的nuget包中)
这里是它变得复杂的部分。我在控制器中使用的DTO与客户端库共享。我告诉nswag不要生成DTO,因为出于各种原因,我需要与客户端共享手写的DTO。为了避免Web API项目和客户端项目之间的循环引用,我创建了第三个“Models”项目来包含这些DTO对象。这样依赖关系看起来就像这样:

  • Web API ->模型
  • 客户端->模型,Web API

不幸的是,dotnet pack的默认行为是为Models项目创建一个包。然而,我希望Models程序集与Client包一起打包(因此它有两个DLL),并在最终的nuspec中继承包依赖关系。我所做的所有研究都表明这是不可能的,或者至少不容易。
在这一点上,我觉得我走错了路,所以我想重新设置,看看有什么更好的方法。我在这里实际上试图解决的目标是一种在Web API和客户端项目之间共享模型的方法,而不会创建循环依赖。也许这意味着我设置自定义目标的方式需要改变,但我不确定最好的方法是什么。
有什么更好的方法来设置这些依赖关系和代码生成工作流,以便我可以拥有一个包含模型和生成的客户端类的Client nuget包?

nwsw7zdq

nwsw7zdq1#

好吧,根据你的评论,我认为这个答案是我评论的一个扩展部分。
有什么更好的方法来设置这些依赖关系和代码生成工作流,以便我可以拥有一个包含模型和生成的客户端类的Client nuget包?
如果你想让DTO和Web API项目分开,可以考虑使用共享项目。共享项目不会产生DLL,而是直接编译到引用项目中,因此,你不会面临打包问题。另一点是,考虑创建两个单独的NuGet包:一个用于共享模型,另一个用于生成的客户端代码。这样,消费者可以选择他们是只需要模型还是同时需要模型和客户端代码。
如何创建共享项目?我以前从未听说过这些。我也不记得在Jetbrains Ride的新项目模板中看到过
我不熟悉Jetbrains Rider,但我可以指导你使用Visual Studio 2022如何做到这一点。
请按照以下步骤在Visual Studio 2022中创建类库项目。


的数据



完整输出:



注:如果需要更多关于how to use ASP.NET Core class library的规格,请使用refer to this official document

相关问题