grpc服务器go中的依赖注入

grpc服务器go中的依赖注入,go,dependency-injection,grpc,Go,Dependency Injection,Grpc,假设我们有一个包含grpc服务器实现的GOAPI 此grpc服务器方法必须执行各种任务,这些任务需要在同一api中抽象为不同的服务 是否有办法将此新服务注入grpc服务器 示例代码: package grpcserver func (g *GrpcServer) GrpcServerExample(ctx context.Context, r *grpcpackage.SampleGrpcRequest) (*grpcpackage.SampleGrpcResponse, error) {

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

此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
}

您可以在注册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{},
    })
}
服务接口.go

package grpcserver

type Service interface {
    DoSomething() int
}
执行服务

package grpcserver

type ServiceImpl struct {
}

func (s *ServiceImpl) DoSomething() int {
    return 123
}

如果您正在用相同的API抽象某些东西,为什么不传递接口呢?然而,如果两个组件做两件根本不同的事情,我认为抽象不是前进的方向。不同的东西由不同的组件处理,而不是由抽象层处理…@EliasVanOotegem我不想把它放在proto文件中
GrpcServerExample
的服务定义中,因为
differentService
是api内部的。还有别的办法吗?