Thrift中如何将服务作为类型使用?编译报错类型未定义的解决
解决Thrift编译报错:Type "Interface1" not defined
这个报错的根源其实是对Thrift的service定义理解有点偏差——Thrift里的service是用来声明RPC接口的,它可不是能当作参数传递的数据类型哦!你直接把Interface1作为Interface2方法的参数类型,Thrift自然识别不了,所以才会抛出“Type not defined”的错误。
针对你想在Interface2中使用Interface1相关能力的需求,分两种场景给出解决方案:
场景1:传递Interface1处理的数据而非服务本身
如果你的需求是把Interface1要处理的数据传给Interface2做判断,那应该把共用的数据抽成结构体(struct),因为结构体才是Thrift中用来定义可传输数据类型的方式:
// 先定义共用的数据结构,供两个服务使用 struct Interface1Data { 1: list<string> items } // Interface1使用这个结构体作为参数 service Interface1 { void add(1: Interface1Data data) } // Interface2也使用这个结构体作为参数 service Interface2 { bool isThere(1: Interface1Data item) }
这样修改后,用你原来的编译命令(注意纠正拼写错误,是csharp不是charp)就能正常编译了:
thrift-0.11.0.exe --gen csharp .\example.thrift
场景2:让Interface2调用Interface1的RPC方法
如果你的需求是让Interface2的方法内部调用Interface1的服务(而非传递服务实例),Thrift不支持直接把service作为参数传递(毕竟RPC服务是跨进程/机器的,没法直接传递对象实例),你可以这么做:
- 在
Interface2的服务实现代码中,直接初始化Interface1的客户端,然后调用其方法。 - 如果需要动态指定要调用的
Interface1实例,可以传递服务的地址/标识作为参数,在Interface2的实现里根据标识创建对应的Interface1客户端进行调用。
举个伪代码示例(C#):
public class Interface2Impl : Interface2.Iface { public bool isThere(string interface1ServiceAddress) { // 根据地址创建Interface1客户端 var transport = new TSocket(interface1ServiceAddress, 9090); var protocol = new TBinaryProtocol(transport); var interface1Client = new Interface1.Client(protocol); transport.Open(); // 调用Interface1的方法做判断逻辑 // ... transport.Close(); return true; } }
内容的提问来源于stack exchange,提问作者Vasiu Alexandru
相关产品推荐
相关产品推荐

