class Yrpc::Controllers::ServiceBinder
Public Class Methods
new(service)
click to toggle source
初始化。。没什么好解释的
# File lib/yrpc/controllers/service_binder.rb, line 12 def initialize(service) @service = service end
Public Instance Methods
bind!(controller)
click to toggle source
通过controller绑定所有的方法
# File lib/yrpc/controllers/service_binder.rb, line 18 def bind!(controller) rpc_methods.each { |name, desc| bind_method(controller, name, desc) } end
rpc_desc(request_method)
click to toggle source
# File lib/yrpc/controllers/service_binder.rb, line 22 def rpc_desc(request_method) @service.rpc_descs[request_method] end
Private Instance Methods
bind_method(controller, method_name, desc)
click to toggle source
打开类并且进行一个方法define,返回给这个方法打call。这里要注意的是request 会以参数形式构造进controller 这里也涉及到stream 类型。
# File lib/yrpc/controllers/service_binder.rb, line 31 def bind_method(controller, method_name, desc) method_desc = method_name.to_s.to_sym method_key = method_name.to_s.underscore.to_sym current_desc = rpc_desc(method_desc) service_ref = @service @service.class_eval do if desc.request_response? define_method(method_key) do |message, active_call| c = controller.new(method_key: method_key, service: service_ref, message: message, active_call: active_call, rpc_desc: desc) begin c.call(method_key) rescue => e p method_key p e.backtrace_locations desc && desc.output ? desc.output.new(status: {code: e.respond_to?(:code) ? e.code : Yrpc::Response::Code::ERROR , message: e.message}) : (raise e) end end elsif desc.client_streamer? define_method(method_key) do |active_call| c = controller.new(method_key: method_key, service: service_ref, message: proc { |&block| active_call.each_remote_read(&block) }, active_call: active_call, rpc_desc: desc) begin c.call(method_key) rescue => e desc && desc.output ? desc.output.new(status: {code: e&.code || Yrpc::Response::Code::ERROR, message: e.message}) : (raise e) end end elsif desc.server_streamer? define_method(method_key) do |message, active_call, &block| c = controller.new(method_key: method_key, service: service_ref, message: message, active_call: active_call, rpc_desc: desc) begin c.call(method_key) rescue => e desc && desc.output ? desc.output.new(status: {code: e&.code || Yrpc::Response::Code::ERROR , message: e.message}) : (raise e) end end else # bidi define_method(method_key) do |messages, active_call, &block| c = controller.new(method_key: method_key, service: service_ref, message: messages, active_call: active_call, rpc_desc: desc) begin c.call(method_key) rescue => e desc && desc.output ? desc.output.new(status: {code: e&.code || Yrpc::Response::Code::ERROR, message: e.message}) : (raise e) end end end end end
rpc_methods()
click to toggle source
讲方法都代理到boundDesc 上
# File lib/yrpc/controllers/service_binder.rb, line 82 def rpc_methods @service.rpc_descs.map { |rd| BoundDesc.new(rd) } end