本文次要赏析一下go-ddd-sample

我的项目构造

├── _sql├── application├── config├── domain│   └── repository├── infrastructure│   └── persistence│       └── testdata└── interfaces    └── testdata
这里分为application、domain、infrastructure、interfaces四层

domain

├── repository│   ├── mock_user.go│   └── user.go└── user.go
domain层定义了模型及repository接口,同时利用go generate生成repository的mock实现

application

// UserInteractor provides use-casetype UserInteractor struct {    Repository repository.UserRepository}// GetUser returns userfunc (i UserInteractor) GetUser(ctx context.Context, id int) (*domain.User, error) {    return i.Repository.Get(ctx, id)}// GetUsers returns user listfunc (i UserInteractor) GetUsers(ctx context.Context) ([]*domain.User, error) {    return i.Repository.GetAll(ctx)}// AddUser saves new userfunc (i UserInteractor) AddUser(ctx context.Context, name string) error {    u, err := domain.NewUser(name)    if err != nil {        return err    }    return i.Repository.Save(ctx, u)}
applicatioin层调用domain层来进行业务编排

infrastructure

└── persistence    ├── main_test.go    ├── testdata    │   ├── schema.sql -> ../../../_sql/schema.sql    │   └── users.yml    ├── user_repository.go    └── user_repository_test.go
infrastructure的persistence实现了domain层定义的repository接口

interfaces

├── handler.go├── handler_test.go├── main_test.go└── testdata    ├── schema.sql -> ../../_sql/schema.sql    └── users.yml
interfaces基于net/http来提供http接口

小结

go-ddd-sample分为application、domain、infrastructure、interfaces四层,其中domain定义repository接口,infrastructure层实现该接口,application层通过domain来编排业务逻辑,interfaces层则基于net/http来提供http接口。

doc

  • go-ddd-sample