作为一名软件开发人员,如果我们希望使代码保持清洁和可维护性,我们将代码分割成不同的层次。
通常边界至少放置在基础设施和业务逻辑之间。当我们专门处理复杂的业务逻辑时,基础架构依赖于我们的业务逻辑是可取的,这样在更改基础架构时不会破坏我们的软件。
开发一个新的软件项目时的第一个决定是否选择一个结构来实现分层。 大多数情况下,我选择简洁的架构,但您有另一个很好的选择,例如 Domain Driven Design(领域驱动设计)。
独立于您选择的架构,我们必须粘贴来自不同模块以提供新功能,而这正是依赖注入所发挥的作用。
理解依赖注入,没有比示例更好的了。 想象一下,我们必须为我们想象中的项目实现用户注册,并且我们将用简约的架构来实现这一点。
我们可以想出一个像这样的实体:
package entity
//User结构体
type User struct {
email string
password string
name string
dateOfBirth string
}
//业务级别的验证
func Validate() error {
...
}
现在我们来创建一个用户注册的用例:
package usecase
import "entity"
func RegisterUser(user entity.User) {
//验证和保存用户逻辑
}
看起来我们需要一些基础设施模块来存储用户。 我们还没有在基础设施级别实现任何 UserRepository,我们还遇到了另一个问题,通过简洁的架构原则,更高级别的层无法知道低级别层的存在。
如何来解决这个问题?
不需要触及基础设施中的任何部分,我们会对我们的用例说,有某种用户保护程序可以帮助我们的用户注册。
package usecase
import "entity"
type UserSaver interface {
Save(user entity.User) error
}
//UserRegisterUseCase 存储它的依赖关系
type UserRegisterUseCase struct {
userSaver UserSaver
}
func newUserRegisterUseCase(userSaver UserSaver) UserRegisterUseCase {
return &{userSaver}
}
func (u UserRegisterUseCase) RegisterUser(user entity.User) error {
user.Validate()
err := u.userSaver.Save(user)
if (err != nil) {
return err
}
}
看起来不错, 我们甚至没有涉及到基础架构层,我们将整个用例从实体输入到保存操作。 这是高层次的依赖倒置,这是 Go 的一个优势。
继续实现我们的 UserRepository…
package infrastructure
import "entity"
//UserRepository 管理用户持久化
type UserRepository struct {
psqlClient psql.PsqlClient
}
func NewUserRepository(psqlClient psql.PsqlClient) UserRepository
{
return &UserRepository{psqlClient}
}
//Save user
func Save(user entity.User) error {
...
}
func GetByEmail(email string) error {
...
}
让我们来看看如何操作依赖注入的
package main
import (
"usecase"
"infrastructure"
"psqlClient"
)
func main() {
psqlClient := psqlClient.NewPsqlClient()
userRepository := infrastructure.NewUserRepository(psqlClient)
useCase := usecase.newUserRegisterUseCase(userRepository)
//现在我们可以将用例注入到web或者cli
}
我们实例化并注入主模块中的每个依赖项。 通过这个我们可以在程序的单个点上看到并控制依赖关系树。
正如你所看到的,我们确保最高的 2 层,实体和用例不知道最底层的存在。 这是至关重要的,因为基础架构可以改变而不会影响业务逻辑。
第二个好处是我们将 psql 第三方包分离到一个模块中。 本模块将支持在第三方软件包的更新版本中所做的每一项更改。
最后但并非最不重要的一点,使用依赖注入可以让你测试你的模块而不需要测试它们的依赖关系
让我们来看看我们的User Repository的例子,为什么在测试 User Repository 时,您还想测试Psql Client?使用依赖注入可以模拟 Psql 客户端,并确保 User Repository 调用正确的 Psql 客户端方法。
在我看来手动实例化就够了。 如果项目足够大,您可以在主包中创建不同的文件来执行依赖注入,然后从main.go中调用它们。
转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记
如果觉得本篇文章对您十分有益,何不 打赏一下
本文链接地址: Go 实现依赖注入
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可
Original url: Access
Created at: 2018-12-19 13:39:25
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论