提问人:void.pointer 提问时间:11/15/2023 最后编辑:marc_svoid.pointer 更新时间:11/16/2023 访问量:33
nswag 生成的客户端项目的循环依赖关系问题
Circular dependency issue with nswag generated client project
问:
我有一个使用该包的 ASP.NET Core 7 Web API 项目。我的目标是使用其 OpenAPI 规范 JSON 文件为该服务生成客户端类,并将其发布为客户端 nuget 包。Swashbuckle.AspNetCore
我现在的做法如下:
- 在 Web API 项目中定义了一个自定义目标,实质上是为了吐出文件而运行(这是 OpenAPI 规范)。
dotnet swagger tofile
swagger.json
- 第二个项目实质上是一个空项目,它包含一个自定义目标,要运行以从上一个文件生成客户端代码。这个项目指向第一个项目,强制它首先运行(所以我总是有一个更新的)。它还用于避免 Web API 程序集包含在从它生成的 nuget 包中)
nswag run
swagger.json
ProjectReference
swagger.json
PrivateAssets="all"
这是它变得复杂的部分。我在控制器中使用的 DTO 与客户端库共享。我告诉 nswag 不要生成 DTO,因为出于各种原因,我需要与客户共享手写的 DTO。为了避免在 Web API 项目和客户端项目之间产生循环引用,我创建了第三个“模型”项目来包含这些 DTO 对象。这样,依赖项如下所示:
- Web API >模型
- 客户端 -> 模型、Web API
遗憾的是,默认行为是为 Models 项目创建包。但是,我希望将 Models 程序集与 Client 包打包在一起(因此它有两个 DLL),并在最终的 nuspec 中继承包依赖项。我所做的所有研究都表明这是不可能的,或者至少,不容易。dotnet pack
在这一点上,我觉得我走错了路,所以我想重置一下,看看有什么更好的方法。我在这里实际尝试解决的目标是在 Web API 和客户端项目之间共享模型,而无需创建循环依赖项。也许这意味着我设置自定义目标的方式需要改变,但我不确定最好的方法是什么。
设置这些依赖项和此代码生成工作流的更好方法是什么,以便我可以同时拥有包含模型和生成的客户端类的单个客户端 nuget 包?
答:
好吧,根据您的评论,我认为这个答案是我评论的扩展部分。
设置这些依赖项和此代码的更好方法是什么 生成工作流,以便我可以拥有单个客户端 nuget 包 使用模型和生成的客户端类?
如果要将 DTO 与 Web API 项目分开,请考虑使用共享项目。共享项目不会生成 DLL;相反,它们被直接编译到引用项目中,因此,您不会遇到打包问题。另一点是,请考虑创建两个单独的 NuGet 包:一个用于共享模型,另一个用于生成的客户端代码。这样,使用者可以选择是只想要模型,还是同时需要模型和客户端代码。
如何创建共享项目?我从未听说过这些 以前。我不记得在新项目模板中看到过它 Jetbrains 骑行
我不熟悉 Jetbrains Rider,但我可以指导您使用 Visual Studio 2022 如何做到这一点。
请按照以下步骤在 Visual Studio 2022 中创建类库项目。
完整输出:
评论