dto.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package binding
  2. import (
  3. "git.sxidc.com/go-framework/baize/domain"
  4. "git.sxidc.com/go-framework/baize/infrastructure/logger"
  5. "git.sxidc.com/go-framework/baize/tag"
  6. "git.sxidc.com/service-supports/fserr"
  7. "reflect"
  8. )
  9. type DTO interface{}
  10. func AssignDTOToDomainObject(dto DTO, domainObject domain.Object) error {
  11. return tag.UseAssignTag(dto, domainObject,
  12. func(fromFieldName string, fromFieldElemValue reflect.Value, retFieldElementValue reflect.Value, assignTag *tag.AssignTag) error {
  13. if fromFieldElemValue.IsZero() {
  14. return nil
  15. }
  16. return tag.DefaultOnAssignParsedFieldTagFunc(fromFieldElemValue, retFieldElementValue, assignTag)
  17. })
  18. }
  19. func Field[T any](dto DTO, fieldName string) T {
  20. var zero T
  21. fieldValue, err := getDTOFieldValue(dto, fieldName)
  22. if err != nil {
  23. logger.GetInstance().Error(err)
  24. return zero
  25. }
  26. if !fieldValue.IsValid() {
  27. err := fserr.New("dto字段" + fieldName + "无法赋值")
  28. logger.GetInstance().Error(err)
  29. return zero
  30. }
  31. retValue, ok := fieldValue.Interface().(T)
  32. if !ok {
  33. err := fserr.New("dto字段" + fieldName + "无法转换类型")
  34. logger.GetInstance().Error(err)
  35. return zero
  36. }
  37. return retValue
  38. }
  39. func ToConcreteDTO[T DTO](object DTO) T {
  40. concrete, ok := object.(T)
  41. if !ok {
  42. logger.GetInstance().Error(fserr.New("DTO转化失败"))
  43. var zero T
  44. return zero
  45. }
  46. return concrete
  47. }
  48. func getDTOFieldValue(dto DTO, fieldName string) (*reflect.Value, error) {
  49. dtoType := reflect.TypeOf(dto)
  50. if dtoType.Kind() != reflect.Pointer {
  51. return nil, fserr.New("dto必须是结构指针类型")
  52. }
  53. if dtoType.Kind() == reflect.Pointer && dtoType.Elem().Kind() != reflect.Struct {
  54. return nil, fserr.New("dto必须是结构指针类型")
  55. }
  56. dtoValue := reflect.ValueOf(dto)
  57. if dtoType.Kind() == reflect.Pointer && !dtoValue.IsValid() {
  58. return nil, fserr.New("dto为nil")
  59. }
  60. fieldValue := dtoValue.Elem().FieldByName(fieldName)
  61. return &fieldValue, nil
  62. }