在grpc服务器中进行依赖注入

假设我们有一个包含grpc服务器实现的go api。</ p>

此 grpc服务器方法必须执行多种任务,这些任务需要抽象为同一api中的不同服务。</ p>

是否可以将新服务注入grpc服务器? / p>

示例代码:</ p>

 程序包grpcserver 

func(g * GrpcServer)GrpcServerExample(ctx context.Context,r * grpcpackage.SampleGrpcRequest )(* grpcpackage.SampleGrpcResponse,错误){
service:= differentService {} //如何注入它而不是在此处创建
结果:= service.DoSomething()
返回nil,nil
}
< / code> </ pre>
</ div>

展开原文

原文

Suppose we have a go api containing a grpc server implementation.

This grpc server method has to do a variety of tasks which needs to be abstracted as a different service within the same api.

Is there a way to inject this new service in the grpc server?

Sample code:

package grpcserver

func (g *GrpcServer) GrpcServerExample(ctx context.Context, r *grpcpackage.SampleGrpcRequest) (*grpcpackage.SampleGrpcResponse, error) {
    service := differentService{}   //how to inject this instead of creating here
    result := service.DoSomething()
    return nil,nil
}

duanlaican1849
duanlaican1849 我不想将其放在proto文件的GrpcServerExample的服务定义中,因为differentService是api的内部。还有其他办法吗?
接近 4 年之前 回复
douyinzha5820
douyinzha5820 如果您要使用相同的API进行抽象,为什么不传递接口呢?但是,如果2个组件执行2个根本不同的事情,我认为抽象不是前进的方向。不同的事物由不同的组件而不是抽象层处理...
接近 4 年之前 回复

1个回答

You can inject the service into GrpcServer while registering the gRPC server.

package grpcserver

type GrpcServer struct {
    MyService Service
}

func (g *GrpcServer) GrpcServerExample(ctx context.Context, r *grpcpackage.SampleGrpcRequest) (*grpcpackage.SampleGrpcResponse, error) {
    service := g.MyService
    result := service.DoSomething()
    return nil,nil
}

func main() {
    s := grpcpackage.NewServer()

    grpcpackage.RegisterGrpcServer(s, &GrpcServer{
        // Inject Here
        MyService: &ServiceImpl{},
    })
}

service_interface.go

package grpcserver

type Service interface {
    DoSomething() int
}

service_impl.go

package grpcserver

type ServiceImpl struct {
}

func (s *ServiceImpl) DoSomething() int {
    return 123
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问