Explorar o código

简化binding

yjp hai 1 ano
pai
achega
b5b205241e
Modificáronse 2 ficheiros con 30 adicións e 13 borrados
  1. 26 1
      binding/binding.go
  2. 4 12
      examples/binding/main.go

+ 26 - 1
binding/binding.go

@@ -3,9 +3,11 @@ package binding
 import (
 	"git.sxidc.com/go-framework/baize/api"
 	"git.sxidc.com/go-framework/baize/domain"
+	"git.sxidc.com/go-tools/utils/reflectutils"
 	"git.sxidc.com/go-tools/utils/strutils"
 	"git.sxidc.com/service-supports/fserr"
 	"net/http"
+	"reflect"
 	"strings"
 )
 
@@ -163,7 +165,30 @@ func (item *BindItem[O]) bind(router api.Router, middlewares ...api.Handler) {
 
 				domainObjects = innerDomainObjects
 			} else {
-				// TODO Tag处理
+				if item.Objects != nil && len(item.Objects) != 0 {
+					for _, object := range item.Objects {
+						if object == nil {
+							continue
+						}
+
+						objectType := reflect.TypeOf(object)
+						if !reflectutils.IsTypeStructOrStructPointer(objectType) {
+							var outputZero O
+							item.ResponseFunc(c, http.StatusOK, outputZero, fserr.New("领域对象不是结构或结构指针"))
+							return
+						}
+
+						obj := reflect.New(reflectutils.PointerTypeElem(objectType)).Interface()
+						err := AssignDTOToDomainObject(dto, obj)
+						if err != nil {
+							var outputZero O
+							item.ResponseFunc(c, http.StatusOK, outputZero, err)
+							return
+						}
+
+						domainObjects = append(domainObjects, obj)
+					}
+				}
 			}
 
 			// 执行业务函数

+ 4 - 12
examples/binding/main.go

@@ -13,10 +13,10 @@ import (
 )
 
 // curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' "http://localhost:10000/test/v1/class/create"
-// curl -X PUT -H "Content-Type: application/json" -d '{"id":"1b86aba688384f43a0981f1d41ac8346", "name":"test-new"}' "http://localhost:10000/test/v1/class/update"
+// curl -X PUT -H "Content-Type: application/json" -d '{"id":"faa5452038204246971c48e5b0d775af", "name":"test-new"}' "http://localhost:10000/test/v1/class/update"
 // curl -X GET "http://localhost:10000/test/v1/class/query?name=test-new&pageNo=0&pageSize=1"
-// curl -X GET "http://localhost:10000/test/v1/class/get?id=1b86aba688384f43a0981f1d41ac8346"
-// curl -X DELETE "http://localhost:10000/test/v1/class/1b86aba688384f43a0981f1d41ac8346/delete"
+// curl -X GET "http://localhost:10000/test/v1/class/get?id=faa5452038204246971c48e5b0d775af"
+// curl -X DELETE "http://localhost:10000/test/v1/class/faa5452038204246971c48e5b0d775af/delete"
 
 type CreateClassJsonBody struct {
 	Name string `json:"name" binding:"required" assign:"toField:Name"`
@@ -110,15 +110,7 @@ func main() {
 		Path:         "/class/update",
 		ResponseFunc: binding.SendMsgResponse,
 		DTO:          &UpdateClassJsonBody{},
-		FormDomainObjectsFunc: func(c *api.Context, dto binding.DTO) ([]domain.Object, error) {
-			jsonBody := binding.ToConcreteDTO[*UpdateClassJsonBody](dto)
-			return []domain.Object{
-				&Class{
-					ID:   jsonBody.ID,
-					Name: jsonBody.Name,
-				},
-			}, nil
-		},
+		Objects:      []domain.Object{&Class{}},
 		ServiceFunc: func(c *api.Context, dto binding.DTO, objects []domain.Object) (any, error) {
 			id := domain.Field[string](objects[0], "ID")
 			newName := domain.Field[string](objects[0], "Name")