在 Golang 上使用整洁架构(Clean Architecture)- 3

bxcodec 在写完上一篇文章 后,收到了 pull request。由此,作者尝试做了一些改进,在最新的 master 分支中引入了 domain package

以下为旧结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
models
├── article.go
├── author.go
└── errors.go

article
├── delivery
│   └── http
│       ├── article_handler.go
│       └── article_test.go
├── mocks
│   ├── ArticleRepository.go
│   └── ArticleUsecase.go
├── repository //Encapsulated Implementation of Repository Interface
│   ├── mysql_article.go
│   └── mysqlarticle_test.go
├── repository.go // Repository Interface
├── usecase //Encapsulated Implementation of Usecase Interface
│   ├── articleucase_test.go
│   └── artilce_ucase.go
└── usecase.go // Usecase Interface.

可以看出,在旧结构中,模块(比如:article)中包含了具体实现和“合同”(ArticleUsecase, ArticleRepository)。

因此,作者尝试采用 Ben Johnson 在 https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1 中提出的一项新改进。

对于 domain package,作者并没有把它移到项目根目录下,而是将其移动到单一的 package 中,以便与旧结构中使用的 models package 保持一致。

以下为新结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
domain
├── mocks
│   ├── ArticleRepository.go
│   ├── AuthorRepository.go
│   └── ArticleUsecase.go
├── article.go
├── author.go
└── errors.go

article
├── delivery
│   └── http
│       ├── article_handler.go
│       └── article_test.go
├── repository //Encapsulated Implementation of Repository Interface
│   └── mysql
│       ├── mysql_article.go
│       └── mysqlarticle_test.go
└── usecase //Encapsulated Implementation of Usecase Interface
    ├── articleucase_test.go
    └── artilce_ucase.go

作者将 models 改名为 domain,并将所有接口“合同”( Usecase、Repository)移入 domain package 中

作者在末尾也提到,还不知道新结构有没有比旧结构更好?但是,作者将尝试在项目中使用这种新结构。如果发生任何问题,这个 PR 将关闭。但是,如果对于开发人员来说,使用新结构很好并且更舒适,那么作者便会将其合并到主分支中。


CatchZeng
Written by CatchZeng Follow
AI (Machine Learning) and DevOps enthusiast.