使用 Clean Architecture 使用 DDD 实现 Go REST API 示例

541 阅读1分钟

(#folder-design)文件夹设计

├── api
│   └── configs
│   └── controllers
│       └── v1
├── application
│   └── consts
│   └── users
│       └── consumers
│       └── mappers
│       └── models
├── domain
│   └── common
│   └── users
├── infrastructure
│   └── common
│       └── event-dispatcher
│       └── persistance
│   └── users

(#api-presentation-layer)Api (表现层)

这一层是为客户端(移动、网络等)应用程序访问我们的领域而开发的部分。它将把本层的请求转发给应用层,并公开它从应用层收到的响应。

正如你在示例项目中看到的,我们的项目将通过控制器类使用HTTP协议从外部世界访问。下面是示例代码片段,它将HTTP收到的请求转发到应用层,并返回它收到的结果。

func CreateGuestUser(group *echo.Group, userService users.UserService) {
    path := fmt.Sprintf("%s/GuestUser", _prefix)
    group.POST(path, func(context echo.Context) error {
        var (
            user *models.NewUserModel
            err  error
        )
        
        if user, err = userService.AddNewGuestUser(context2.Background()); err != nil {
            return err
        }
        
        return context.JSON(http.StatusCreated, user)
    })
}

###(#application-layer)应用层

应用层目前有应用服务、事件消费者、映射器和数据传输对象。然而,它也可以包含跨领域的关注,如事务管理、日志、缓存和异常处理。(很快)

应用层只从域层调用一个聚合根,并且可以使用其功能。之后,它可以将聚合根上的所有变化保存到任何数据库系统中。

正如你在示例代码块中看到的,一个新的客户用户在应用服务中被创建,然后保存到数据库中。然后,创建的相关用户信息被映射到user-created-model并被发送到上层。

func (service userService) AddNewGuestUser(ctx context.Context) (*models.NewUserModel, error) {
    user := users.NewGuestUser()
    
    if err := service.Repository.Add(ctx, user); err != nil {
        return nil, err
    }
    
    return mappers.MapNewUserModel(user), nil
}

GitHub

github.com/rozturac/go…