如何在grpc代码优先服务的返回类型上使用多态性?

问题描述 投票:0回答:1

我想在 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
说我有两种类型的返回类型?

c# grpc .net-6.0 grpc-dotnet grpc-code-first
1个回答
0
投票

如果您无法更改

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));
© www.soinside.com 2019 - 2024. All rights reserved.