c# - 没有 Visual Studio 的 OData v4 客户端代码
问题描述
OData v4 客户端代码生成器 ( https://marketplace.visualstudio.com/items?itemName=bingl.ODatav4ClientCodeGenerator ) 将使用 Visual Studio 生成我需要的代理类,但我需要在我的 C# 代码中生成该类。
有没有办法在不使用 Visual Studio 的情况下在 C# 中生成相同的代理类?
解决方案
研究如何从 C# 执行 T4
模板 使用 C#
运行 T4 模板 以编程方式运行 T4 文本模板
我可以从 C# 以编程方式使用 T4 吗?
简短的回答是,文本模板转换可执行文件和相关的运行时随 Visual Studio 一起分发,因此虽然您的 C# 代码可以手动执行转换过程,而无需打包您自己的解析器和转换引擎,但它几乎只需要在安装了 Visual Studio 的 PC 上工作。
您是否不能简单地将客户端代理生成到安装了 VS 的 PC 上的 dll 中,并在您没有 Visual Studio 的应用程序中使用该 dll,例如在 VS Code 或其他编辑器中?如果这是一个因素,您可以使用 VS 的社区版生成客户端代理,而不会出现太多问题。
如果您控制 API,那么最简单的解决方案是在 API 解决方案中创建一个新项目,将 T4 客户端放入其中并在部署过程中简单地重新生成客户端,然后其他应用程序可以直接使用客户端 dll。
如果您不控制 API 的项目,请联系开发人员,看看他们是否已经为您执行此操作!
可能有其他替代方案可供探索,而不是使用客户端库,或者避免在运行时重新生成。如果您的代码在架构的某些元素方面是高度动态的,那么请考虑编写您自己的通用代理,该代理采用基于字符串的参数或匿名对象和/或表达式,并手动将它们转换为特定的 OData 查询语法以通过 WebClient 执行。如果没有关于您的特定场景的更多信息,实现这一目标的方法差异很大。
从不同的角度考虑您的要求,OData v4 客户端代理尝试复制整个 API,如果 API 的某些元素的更改速度快于您希望重新分发重新生成的代理的速度,那么您只需要找到一个仅针对您遇到问题的架构元素的非客户端代理解决方案。
您不必使用代理类与 OData v4 API 进行通信,T4 脚本作为解决方案加速器提供,可让您快速针对 API 进行编码,您不必强制使用它,但它很有帮助。
您可能还可以将 3rd 方应用程序或 dll 打包到您的应用程序中以帮助您实现这一目标,但是执行 T4 客户端代理类只是工作的一半,如果您在运行时执行此操作,那么您还需要手动编译这些生成的类,以便您可以执行它们。
意识到这个问题,在我们创建服务 API 的应用程序中,我们还生成一个客户端代理 dll 并(通过 Nuget)提供给我们的开发人员或可能想要与 API 交互的客户端。因此,每次发布服务时,我们都会使用 CI 中的脚本(通过 Azure DevOps)在重新部署服务时重新生成和发布客户端 API DLL。
推荐阅读
- javascript - 如何将具有嵌套数组的数组表示为对象
- azure - 是否有 Azure 服务连接的预设查询以使用 azure-devops-api 检索证书信息?
- email - 如何防止使用域中的虚假帐户发送电子邮件
- javascript - 在 Next.js 中导入 react-hook-mousetrap 时出现“无法在模块外使用导入语句”错误
- apache-spark - Pyspark - RDD 提取值进行聚合
- reactjs - Firebase authentication without user's credentials
- sql-server - 未通过 HTTP Sink 发送 Serilog 丰富的属性
- python - Python - 将参数定义的曲线拟合到另一条固定曲线
- azure-functions - Azure Function 中的 Google Ads API - 如何进行身份验证?
- javascript - 使用带有 Django 框架的 javascript 更改 img 标记 src 值