序
本文次要赏析一下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