From 7bd2c6403cb503a8a74589afd57776680ddc542e Mon Sep 17 00:00:00 2001 From: geek Date: Mon, 5 Jun 2017 19:46:02 +0900 Subject: [PATCH] service interface added reflect method call refactoring --- gateway/service_test.go | 70 +++++++++++++++++++++++++++++++++++++++-- gateway/services.go | 34 ++++++++++++++------ glide.yaml | 8 +++++ 3 files changed, 100 insertions(+), 12 deletions(-) diff --git a/gateway/service_test.go b/gateway/service_test.go index 87c3b96..4f57568 100644 --- a/gateway/service_test.go +++ b/gateway/service_test.go @@ -6,7 +6,8 @@ import ( "github.com/stretchr/testify/assert" "encoding/json" "github.com/golang/glog" - "git.loafle.net/overflow/overflow_proxy_service/proxy" + "fmt" + ) func TestServices(t *testing.T) { @@ -50,6 +51,71 @@ func TestServiceParam(t *testing.T) { glog.Fatal("Json Unmarshal Failed : ", err.Error()) } - assert.ObjectsAreEqual(proxy.MemberService{}, meb) + //assert.ObjectsAreEqual(proxy.MemberService{}, meb) +} +// +//type Member struct { +// Email string `json:"email"` +// Password string `json:"password"` +//} +// +//type MemberService struct { +// ServiceName string `json:"serviceName"` +// MethodName string `json:"methodName"` +// Param *Member `json:"param"` +//} + +func TestComvertJson(t *testing.T) { + //res := `{"serviceName":"Member","methodName":"Regist","param":{"email":"geek@loafle.com","password":"qwer5795"}}` + + InitServices() + + meb, _ := g_services["Member"] + mem := meb.GetModel() + m := make(map[string]string) + + m["email"] = "geek@loafle.com" + m["password"] = "qwer5795" + + //ss := member.NewMemberService() + + + convertParam(mem, m) + + methodName := reflect.ValueOf(meb).MethodByName("Regist") + in := make([]reflect.Value, methodName.Type().NumIn()) + + for i := 0; i < methodName.Type().NumIn(); i++{ + temp := methodName.Type().In(i) + + in[i] = reflect.ValueOf(mem) + fmt.Println(temp) + } + + va := methodName.Call(in)[0].String() + fmt.Println(va) } +//func TestReflectType(t *testing.T) { + //ss := &MemberService{} + ////t1 := reflect.ValueOf(ss.Param).Elem() + // + //ms1 := reflect.New(reflect.TypeOf(ss.Param)).Elem().Type() + // + //fmt.Println(ms1) + ////ss.Param = ms1 + ////ss.Param.Email = "ddd" + ////fmt.Println(ss.Param.Email) + //ms := reflect.New(reflect.ValueOf(ss.Param).Type()).Elem() + //fmt.Printf("created a [%T]\n", reflect.ValueOf(ms).Type()) + + +//} + +func TestReflectType(t *testing.T) { + InitServices() + + //serviceName, _ := g_services["Member"] + + //reflect.TypeOf(serviceName).Elem().(member.MemberService) +} \ No newline at end of file diff --git a/gateway/services.go b/gateway/services.go index 0ce021c..0b3196e 100644 --- a/gateway/services.go +++ b/gateway/services.go @@ -4,28 +4,32 @@ import ( "golang.org/x/net/context" pb "git.loafle.net/overflow/overflow_api_service/grpc" "git.loafle.net/overflow/overflow_proxy_service/proxy/member" - "git.loafle.net/overflow/overflow_proxy_service/proxy/noauthagent" "github.com/golang/glog" "encoding/json" "reflect" + "fmt" ) -var g_services map[string]interface{} +var g_services map[string]Services -func AddServices(name string, s interface{}) { +func AddServices(name string, s Services) { if g_services == nil { - g_services = make(map[string]interface{},0) + g_services = make(map[string]Services,0) } g_services[name] = s } +type Services interface { + GetModel()(interface{}) +} + func InitServices() { - g_services = make(map[string]interface{},0) + g_services = make(map[string]Services,0) // proxy services save - AddServices("Member", member.NewMember()) - AddServices("NoAuthAgent", noauthagent.NewNoAuthAgentService()) + AddServices("Member", member.NewMemberService()) + //AddServices("NoAuthAgent", noauthagent.NewNoAuthAgentService()) } type ServiceImpl struct { @@ -35,18 +39,28 @@ func (s *ServiceImpl) ExecServices(c context.Context, in *pb.ServiceInput) (*pb. // Check Service Name serviceName, ok := g_services[in.ServiceName] - glog.Infoln(serviceName) + glog.Infoln(serviceName.GetModel()) if !ok { glog.Error("Not Exist Service Name") } - convertParam(serviceName, in.Param) + model := serviceName.GetModel() + convertParam(model, in.Param) pbs := &pb.ServiceOutput{} + methodName := reflect.ValueOf(serviceName).MethodByName(in.MethodName) + params := make([]reflect.Value, methodName.Type().NumIn()) + + for i := 0; i < methodName.Type().NumIn(); i++{ + temp := methodName.Type().In(i) + + params[i] = reflect.ValueOf(model) + fmt.Println(temp) + } // Todo Call Service Method - result := reflect.ValueOf(serviceName).MethodByName(in.MethodName).Call([]reflect.Value{})[0].String() + result := methodName.Call(params)[0].String() pbs.ResultStr = result diff --git a/glide.yaml b/glide.yaml index 4585c00..02885b9 100644 --- a/glide.yaml +++ b/glide.yaml @@ -1,13 +1,21 @@ package: git.loafle.net/overflow/overflow_gateway_service import: - package: git.loafle.net/overflow/overflow_api_service + vcs: git + version: master + repo: https://git.loafle.net/overflow/overflow_api_service.git subpackages: - grpc - package: git.loafle.net/overflow/overflow_proxy_service + vcs: git + version: master + repo: https://git.loafle.net/overflow/overflow_proxy_service.git subpackages: - proxy/member + - proxy/noauthagent - package: github.com/golang/glog - package: github.com/grpc-ecosystem/grpc-gateway + version: ^1.2.2 subpackages: - runtime - package: golang.org/x/net