.net - GRPC - 为什么`CallInvoker`需要强加`TRequest:class`和`TResponse:class`?
问题描述
抽象类定义的签名对和CallInvoker
都Grpc.Core
施加了类型约束。这可以防止使用结构作为远程方法的响应,例如,它不适用于 F# 结果类型作为响应类型,因为 F#是结构类型。class
TRequest
TResponse
Result<'a, 'b>
Result<_, _>
为什么CallInvoker
需要强加TRequest: class
and TResponse: class
?
https://github.com/grpc/grpc/blob/master/src/csharp/Grpc.Core.Api/CallInvoker.cs
解决方案
我过去看过这个,因为我想建议为 protobuf-net.Grpc 删除它(它适用于 F#,顺便说一句);没有根本原因,除了代码null
在许多地方使用哨兵有意义 - 所有这些场景都需要改变,大概是编码“有值”和“价值”的元组类型(基本上Nullable<T>
但对于任何T
) ; 这是相当多的工作。
不过,我愿意尝试一下;它实际上可能比我为 protobuf-net.Grpc 计划的解决方法更容易(涉及动态包装值类型)。
现在,您必须使用 F# 引用类型。例如,这适用于 protobuf-net.Grpc:
[<DataContract; CLIMutable>]
type MultiplyRequest =
{ [<DataMember(Order = 1)>] X : int
[<DataMember(Order = 2)>] Y : int }
[<DataContract; CLIMutable>]
type MultiplyResult =
{ [<DataMember(Order = 1)>] Result : int }
[<ServiceContract(Name = "Hyper.Calculator")>]
type ICalculator =
abstract MultiplyAsync : MultiplyRequest -> ValueTask<MultiplyResult>
推荐阅读
- python - 如何重塑 3D 数组
- vue.js - 如何简化自定义多复选框组件
- java - Java 8 中用户定义对象的默认值
- ssis - 在 ssis 的 DB2 查询中加载日期参数时出现问题
- jquery - 当嵌入式表单提示输入时,jQuery下拉菜单消失
- c - (Enum) -1 在 C 中代表什么值?如何用 Swift 编写它?
- c++ - 如果作业在附加之前完成,QFutureWatcher 的 finished() 信号会被触发吗?
- amazon-web-services - 是否可以在 AWS Data Pipeline 的另一个参数中使用一个参数?
- subquery - WikiData SPARQL 因子查询 + 标签服务 + 可选而超时
- c# - Asp.Net Core - 在共享主机环境中启用 HttpCompression?