【问题标题】:dependency injection in grpc server gogrpc服务器中的依赖注入
【发布时间】:2016-12-12 12:12:32
【问题描述】:

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

这个 grpc 服务器方法必须执行各种任务,这些任务需要在同一个 api 中抽象为不同的服务。

有没有办法在 grpc 服务器中注入这个新服务?

示例代码:

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
}

【问题讨论】:

  • 如果您要使用相同的 API 抽象一些东西,为什么不传递接口呢?但是,如果 2 个组件做 2 个根本不同的事情,我认为抽象不是前进的方向。不同的事情由不同的组件处理,而不是由抽象层......
  • @EliasVanOotegem 我不想把它放在 proto 文件中 GrpcServerExample 的服务定义中,因为 differentService 是 api 内部的。有没有其他办法?

标签: go dependency-injection grpc


【解决方案1】:

您可以在注册 gRPC 服务器时将服务注入GrpcServer

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多