(#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
}