package binding import ( "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-framework/baize/framework/core/api/request" "git.sxidc.com/go-framework/baize/framework/core/api/response" "git.sxidc.com/go-framework/baize/framework/core/domain" "git.sxidc.com/go-framework/baize/framework/core/infrastructure" "net/http" ) func PostBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...api.Handler) { item.bind(binder, http.MethodPost, middlewares...) } func DeleteBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...api.Handler) { item.bind(binder, http.MethodDelete, middlewares...) } func PutBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...api.Handler) { item.bind(binder, http.MethodPut, middlewares...) } func GetBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...api.Handler) { item.bind(binder, http.MethodGet, middlewares...) } type FormDomainObjectsFunc func(c *api.Context, params request.Params) ([]domain.Object, error) type ServiceFunc[O any] func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (O, error) // SimpleBindItem 简化的BindItem type SimpleBindItem[O any] struct { // URL相对路径 Path string // 响应泛型函数,如果不响应,需要使用NoResponse零值占位 SendResponseFunc response.SendResponseFunc[O] // 使用的请求参数,非必传,当请求参数为nil时,说明该接口没有参数 RequestParams request.Params // 可选的请求参数绑定函数 // 非必传,POST和PUT请求默认为JsonBody,DELETE和GET默认为QueryParams // 额外还提供了一些转化函数: // BindPathParams: 绑定路径参数 // BindMultipartForm: 绑定multipart form // BindFormBody: 绑定form body // XMLBody: 绑定XML body BindRequestParamsFunc request.BindRequestParamsFunc // 通过请求参数构造使用的领域对象,之后在ServiceFunc中会按照构造实体的顺序进行回调 // 非必传,如果为nil,则说明没有领域对象 // 与Objects字段二选一使用,如果都指定,会按照该字段处理 FormDomainObjectsFunc FormDomainObjectsFunc // 使用的领域对象,当使用Tag对实体进行标注后,可以直接通过该字段给定实体,之后在ServiceFunc中会按照给定实体的顺序进行回调 // 非必传,如果为nil或长度为0,则说明没有领域对象 // 与FormObjectsFunc字段二选一使用,如果都指定,会按照FormObjectsFunc字段处理 Objects []domain.Object // 应用服务泛型函数 ServiceFunc ServiceFunc[O] } func (item *SimpleBindItem[O]) bind(binder *Binder, method string, middlewares ...api.Handler) { bindingItem := &BindItem[O]{ Method: method, SimpleBindItem: item, } bindingItem.bind(binder, middlewares...) }