本文主要赏析一下go-ddd-sample
├── _sql ├── application ├── config ├── domain │ └── repository ├── infrastructure │ └── persistence │ └── testdata └── interfaces └── testdata
这里分为application、domain、infrastructure、interfaces四层
├── repository │ ├── mock_user.go │ └── user.go └── user.go
domain层定义了模型及repository接口,同时利用go generate生成repository的mock实现
// UserInteractor provides use-case type UserInteractor struct { Repository repository.UserRepository } // GetUser returns user func (i UserInteractor) GetUser(ctx context.Context, id int) (*domain.User, error) { return i.Repository.Get(ctx, id) } // GetUsers returns user list func (i UserInteractor) GetUsers(ctx context.Context) ([]*domain.User, error) { return i.Repository.GetAll(ctx) } // AddUser saves new user func (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层来进行业务编排
└── persistence ├── main_test.go ├── testdata │ ├── schema.sql -> ../../../_sql/schema.sql │ └── users.yml ├── user_repository.go └── user_repository_test.go
infrastructure的persistence实现了domain层定义的repository接口
├── 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接口。