Browse Source

分拆了容器中的代理和代理创建器

pull/221/head
allanwei 3 years ago
parent
commit
13f27ae502
6 changed files with 131 additions and 84 deletions
  1. +22
    -0
      container/LogBroker.go
  2. +1
    -6
      container/LogBrokerBuilder.go
  3. +47
    -0
      container/NewSessionBroker.go
  4. +1
    -33
      container/NewSessionBrokerBuilder.go
  5. +59
    -0
      container/NewTransactionBroker.go
  6. +1
    -45
      container/NewTransactionBrokerBuilder.go

+ 22
- 0
container/LogBroker.go View File

@ -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)
}

+ 1
- 6
container/LogBrokerBuilder.go View File

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

+ 47
- 0
container/NewSessionBroker.go View File

@ -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)
}

+ 1
- 33
container/NewSessionBrokerBuilder.go View File

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

+ 59
- 0
container/NewTransactionBroker.go View File

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

+ 1
- 45
container/NewTransactionBrokerBuilder.go View File

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

Loading…
Cancel
Save