我想在 grpc 服务中使用代码优先方法使用多态返回类型,但我不知道该怎么做?
我有如下的服务合同
[ServiceContract]
public interface IGreeterService
{
[OperationContract]
BaseResponse SayHello(HelloRequest request,
CallContext context = default);
}
我有两个如下的衍生响应
public class ResponseA : BaseResponse
{
string foo;
}
public class ResponseB: BaseResponse
{
string bar;
}
我的
BaseResponse
存在于另一个库中,我不想(也不能)更改这个库。
public abstract class BaseResponse
{
public string hoo;
}
所以最后我想实现如下
SayHello
public class GreeterService : IGreeterService
{
public BaseResponse SayHello(HelloRequest request, CallContext context = default)
{
if (request.Name == "Heelo")
{
return new ResponseA() {foo = "Hi", hoo = "Hey"};
}
else
return new ResponseB() {bar = "bye", hoo = "You"};
}
}
但我不知道如何对
OperationContract
说我有两种类型的返回类型?
如果您无法更改
BaseResponse
,则必须手动配置它 - 例如:
RuntimeTypeModel.Default.Add(typeof(BaseResponse), false)
// fields of BaseResponse
.Add(1, nameof(BaseResponse.hoo))
// sub-types of BaseResponse
.AddSubType(10, typeof(ResponseA))
.AddSubType(11, typeof(ResponseB));
这里我假设
ResponseA
和 ResponseB
至少可以改变,即
[ProtoContract]
public class ResponseA : BaseResponse
{
[ProtoMember(1)]
public string foo;
}
如果这不可能,您还需要手动配置它们,例如:
RuntimeTypeModel.Default.Add(typeof(ResponseA), false)
.Add(1, nameof(ResponseA.foo));