请教一个 golang DDD 的数据转化问题

2021-04-13 12:35:31 +08:00
 shawncheung

目前想要在服务里面落地 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
    }
}

各位遇到这样的问题有没有什么比较好的比较优雅的方式来解决?

1500 次点击
所在节点    Go 编程语言
2 条回复
baiyi
2021-04-13 13:15:54 +08:00
这里的主要问题应该是将字段的校验放在了值对象的 New 方法中,可以把它剥离出来,像现有的一些库一样,把规则写在 tag 上,然后统一验证。
shawncheung
2021-04-13 14:25:27 +08:00
@baiyi 这里不止是校验的问题,还可能有一些业务逻辑,就是想问下 value object 在 golang 里面怎么处理,写的优雅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/770308

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX