From 13f27ae502cf42f06d921f3e006039fd944e47be Mon Sep 17 00:00:00 2001 From: allanwei Date: Fri, 14 May 2021 16:06:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E6=8B=86=E4=BA=86=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E4=BB=A3=E7=90=86=E5=92=8C=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- container/LogBroker.go | 22 +++++++++ container/LogBrokerBuilder.go | 7 +-- container/NewSessionBroker.go | 47 +++++++++++++++++++ container/NewSessionBrokerBuilder.go | 34 +------------- container/NewTransactionBroker.go | 59 ++++++++++++++++++++++++ container/NewTransactionBrokerBuilder.go | 46 +----------------- 6 files changed, 131 insertions(+), 84 deletions(-) create mode 100644 container/LogBroker.go create mode 100644 container/NewSessionBroker.go create mode 100644 container/NewTransactionBroker.go diff --git a/container/LogBroker.go b/container/LogBroker.go new file mode 100644 index 0000000..784019c --- /dev/null +++ b/container/LogBroker.go @@ -0,0 +1,22 @@ +package container + +import ( + "reflect" +) + +type LogBroker struct { + // 调用器 + caller Caller + // 代码文件 + codeFile string + // 服务方法 + method string + // 描述 + description string +} + +func (broker *LogBroker) Call(in []reflect.Value) []reflect.Value { + // Todo 调整Log + //grmi.Log(session.user, builder.codeFile, builder.method, builder.description) + return broker.caller(in) +} diff --git a/container/LogBrokerBuilder.go b/container/LogBrokerBuilder.go index 97ae94d..1b1cd8e 100644 --- a/container/LogBrokerBuilder.go +++ b/container/LogBrokerBuilder.go @@ -5,7 +5,6 @@ package container import ( "errors" "fmt" - "reflect" ) // 日志代理创建器 @@ -52,9 +51,5 @@ func (builder *LogBrokerBuilder) Build(_ *Session, caller Caller) (Caller, error if caller == nil { return nil, errors.New(fmt.Sprintf("调用器不能为空!")) } - return func(in []reflect.Value) []reflect.Value { - // Todo 调整Log - //grmi.Log(session.user, builder.codeFile, builder.method, builder.description) - return caller(in) - }, nil + return (&LogBroker{caller, builder.codeFile, builder.method, builder.description}).Call, nil } diff --git a/container/NewSessionBroker.go b/container/NewSessionBroker.go new file mode 100644 index 0000000..ecca131 --- /dev/null +++ b/container/NewSessionBroker.go @@ -0,0 +1,47 @@ +package container + +import ( + "errors" + "fmt" + "reflect" +) + +type NewSessionBroker struct { + // 调用器 + caller Caller + // 会话 + session *Session +} + +func (broker *NewSessionBroker) Call(in []reflect.Value) []reflect.Value { + // 从接口获取方法,Receiver不算作入参 + if len(in) < 1 { + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("参数长度错误!")))} + } + firstParameter := in[0] + switch firstParameter.Kind() { + case reflect.Ptr: + if firstParameter.Type() != xormSessionType { + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} + } + if !firstParameter.IsNil() { + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数已经赋值!")))} + } + break + case reflect.Invalid: + break + default: + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} + } + transactionHandler, err := broker.session.transactionHandlerFactory.Create() + if err != nil { + return []reflect.Value{reflect.ValueOf(err)} + } + defer transactionHandler.Close() + in[0] = reflect.ValueOf(transactionHandler.Session()) + return broker.caller(in) +} diff --git a/container/NewSessionBrokerBuilder.go b/container/NewSessionBrokerBuilder.go index cffc0ea..70c3736 100644 --- a/container/NewSessionBrokerBuilder.go +++ b/container/NewSessionBrokerBuilder.go @@ -5,7 +5,6 @@ package container import ( "errors" "fmt" - "reflect" ) // 新会话(XORM会话)代理创建器 @@ -48,36 +47,5 @@ func (builder *NewSessionBrokerBuilder) Build(session *Session, caller Caller) ( if caller == nil { return nil, errors.New(fmt.Sprintf("调用器不能为空!")) } - return func(in []reflect.Value) []reflect.Value { - // 从接口获取方法,Receiver不算作入参 - if len(in) < 1 { - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("参数长度错误!")))} - } - firstParameter := in[0] - switch firstParameter.Kind() { - case reflect.Ptr: - if firstParameter.Type() != xormSessionType { - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} - } - if !firstParameter.IsNil() { - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数已经赋值!")))} - } - break - case reflect.Invalid: - break - default: - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} - } - transactionHandler, err := session.transactionHandlerFactory.Create() - if err != nil { - return []reflect.Value{reflect.ValueOf(err)} - } - defer transactionHandler.Close() - in[0] = reflect.ValueOf(transactionHandler.Session()) - return caller(in) - }, nil + return (&NewSessionBroker{caller, session}).Call, nil } diff --git a/container/NewTransactionBroker.go b/container/NewTransactionBroker.go new file mode 100644 index 0000000..b71bf71 --- /dev/null +++ b/container/NewTransactionBroker.go @@ -0,0 +1,59 @@ +package container + +import ( + "errors" + "fmt" + "reflect" +) + +type NewTransactionBroker struct { + // 调用器 + caller Caller + // 会话 + session *Session +} + +func (broker *NewTransactionBroker) Call(in []reflect.Value) []reflect.Value { + // 从接口获取方法,Receiver不算作入参 + if len(in) < 1 { + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("参数长度错误!")))} + } + firstParameter := in[0] + switch firstParameter.Kind() { + case reflect.Ptr: + if firstParameter.Type() != xormSessionType { + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} + } + if !firstParameter.IsNil() { + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数已经赋值!")))} + } + break + case reflect.Invalid: + break + default: + // Todo Log + return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} + } + transactionHandler, err := broker.session.transactionHandlerFactory.Create() + if err != nil { + return []reflect.Value{reflect.ValueOf(err)} + } + defer transactionHandler.Close() + in[0] = reflect.ValueOf(transactionHandler.Session()) + if err := transactionHandler.Begin(); err != nil { + // Todo Log + return []reflect.Value{reflect.ValueOf(err)} + } + out := broker.caller(in) + lastReturnValue := out[len(out)-1] + if lastReturnValue.Kind() == reflect.Invalid { + if err := transactionHandler.Commit(); err != nil { + // Todo Log + return []reflect.Value{reflect.ValueOf(err)} + } + } + return out +} diff --git a/container/NewTransactionBrokerBuilder.go b/container/NewTransactionBrokerBuilder.go index da61558..56bfd1a 100644 --- a/container/NewTransactionBrokerBuilder.go +++ b/container/NewTransactionBrokerBuilder.go @@ -5,7 +5,6 @@ package container import ( "errors" "fmt" - "reflect" ) // 新事务代理创建器 @@ -48,48 +47,5 @@ func (builder *NewTransactionBrokerBuilder) Build(session *Session, caller Calle if caller == nil { return nil, errors.New(fmt.Sprintf("调用器不能为空!")) } - return func(in []reflect.Value) []reflect.Value { - // 从接口获取方法,Receiver不算作入参 - if len(in) < 1 { - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("参数长度错误!")))} - } - firstParameter := in[0] - switch firstParameter.Kind() { - case reflect.Ptr: - if firstParameter.Type() != xormSessionType { - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} - } - if !firstParameter.IsNil() { - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数已经赋值!")))} - } - break - case reflect.Invalid: - break - default: - // Todo Log - return []reflect.Value{reflect.ValueOf(errors.New(fmt.Sprintf("第一个参数类型不正确!")))} - } - transactionHandler, err := session.transactionHandlerFactory.Create() - if err != nil { - return []reflect.Value{reflect.ValueOf(err)} - } - defer transactionHandler.Close() - in[0] = reflect.ValueOf(transactionHandler.Session()) - if err := transactionHandler.Begin(); err != nil { - // Todo Log - return []reflect.Value{reflect.ValueOf(err)} - } - out := caller(in) - lastReturnValue := out[len(out)-1] - if lastReturnValue.Kind() == reflect.Invalid { - if err := transactionHandler.Commit(); err != nil { - // Todo Log - return []reflect.Value{reflect.ValueOf(err)} - } - } - return out - }, nil + return (&NewTransactionBroker{caller, session}).Call, nil }