
目前想要在服务里面落地 DDD,DDD 里面推荐使用 Entity 和 Value Object 如这篇文章所说: https://www.damianopetrungaro.com/posts/ddd-using-golang-tactical-design/
但是在落地的时候发现数据转化的问题:比如定义了一个 Link Value Object
type Link struct { value string } func (u Link) String() string { return u.value } func NewLink(s string) (URL, error) { if match, _ := regexp.MatchString(`^( https?|ftp)://[^\s/$.?#].[^\s]*$`, s); !match { return Link{}, fmt.Errorf("project url format is invalid: %v", s) } return Link{value: s}, nil } type Project struct { ID uint64 Name string Url Link } 然后框架使用 grpc,那么 grpc 本身是有 pb.XXXRequest 这种类型的:
func (s *ServerImpl) Create( ctx context.Context, req *pb.CreateRequest, res *pb.CreateResponse, ) error { url, err := model.NewLink(req.URL) if err != nil { return err } //...如果这里有很多都是这种值对象的字段,在这里岂不是很多很多类似 // if err != nil { ... } 这样的代码吗?而且这样手工转也比较麻烦 project := model.Project{ ID: req.ID, Url: url } } 各位遇到这样的问题有没有什么比较好的比较优雅的方式来解决?
1 baiyi 2021-04-13 13:15:54 +08:00 这里的主要问题应该是将字段的校验放在了值对象的 New 方法中,可以把它剥离出来,像现有的一些库一样,把规则写在 tag 上,然后统一验证。 |
2 shawncheung OP @baiyi 这里不止是校验的问题,还可能有一些业务逻辑,就是想问下 value object 在 golang 里面怎么处理,写的优雅 |