V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
shawncheung
V2EX  ›  Go 编程语言

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

  •  1
     
  •   shawncheung · 2021-04-13 12:35:31 +08:00 · 1524 次点击
    这是一个创建于 1354 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    2 条回复    2021-04-13 14:25:27 +08:00
    baiyi
        1
    baiyi  
       2021-04-13 13:15:54 +08:00
    这里的主要问题应该是将字段的校验放在了值对象的 New 方法中,可以把它剥离出来,像现有的一些库一样,把规则写在 tag 上,然后统一验证。
    shawncheung
        2
    shawncheung  
    OP
       2021-04-13 14:25:27 +08:00
    @baiyi 这里不止是校验的问题,还可能有一些业务逻辑,就是想问下 value object 在 golang 里面怎么处理,写的优雅
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3825 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:10 · PVG 13:10 · LAX 21:10 · JFK 00:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.