当前位置: 首页 > wzjs >正文

网站开发需要什么开发工具上海有什么公司名称

网站开发需要什么开发工具,上海有什么公司名称,公司建网站费用,鼎豪网络网站建设#作者:曹付江 文章目录 1、示例: 管理依赖关系的容器1.1. 日志记录器设置1.2. 数据库连接设置1.3. 管理依赖关系的容器 2、如何使用容器3、结论 依赖注入(DI)是一种在软件应用程序中促进松散耦合和可测试性的设计模式。它允许将依…

#作者:曹付江

文章目录

  • 1、示例: 管理依赖关系的容器
    • 1.1. 日志记录器设置
    • 1.2. 数据库连接设置
    • 1.3. 管理依赖关系的容器
  • 2、如何使用容器
  • 3、结论

依赖注入(DI)是一种在软件应用程序中促进松散耦合和可测试性的设计模式。它允许将依赖关系(如服务、配置或数据库)注入到组件中,而不是让组件直接创建或管理依赖关系。这将使代码更模块化、更易维护、更易测试。
在本篇文章中,我们将使用一个实用的 Golang 示例来探讨依赖注入模式。我们将分解代码,并解释如何在实际场景中实现依赖注入。

1、示例: 管理依赖关系的容器

该示例由三个 Go 文件组成,它们共同创建了一个 “容器”,用于管理日志记录器、数据库连接和配置等依赖项。让我们深入代码,看看 DI 是如何应用的。

1.1. 日志记录器设置

第一个文件使用 zap 日志库设置了一个日志记录器。日志记录器使用配置文件初始化,NewLogger 函数负责创建日志记录器实例。

func NewLogger(zapConfig string) (*zap.Logger, error) {file, err := os.Open(zapConfig)if err != nil {return nil, fmt.Errorf("failed to open logger config file")}defer file.Close()var cfg zap.Configif err := json.NewDecoder(file).Decode(&cfg); err != nil {return nil, fmt.Errorf("failed to parse logger config json")}logger, err := cfg.Build()if err != nil {return nil, err}defer logger.Sync()logger.Debug("logger construction succeeded")return logger, nil
}

这里,NewLogger 函数将配置文件路径(zapConfig)作为输入,并返回一个 zap.Logger 实例。这是构造函数注入的一个示例,依赖关系(日志记录器配置)被注入到函数中。

1.2. 数据库连接设置

第二个文件使用 gorm 库处理数据库连接。它定义了一个接口 Db 和两个实现(PostgresAdapter 和 MySQLAdapter),用于连接 PostgreSQL 和 MySQL 数据库。

type Db interface {MakeConnection() (*gorm.DB, error)
}
func NewDBConnectionAdapter(dbName, url string, dbMaxIdle, dbMaxOpen, dbMaxLifeTime, dbMaxIdleTime int, gormConf string) Db {switch dbName {case Postgres:return &PostgresAdapter{dbUrl: url, dbMaxIdle: dbMaxIdle, dbMaxOpen: dbMaxOpen, dbMaxLifeTime: dbMaxLifeTime, dbMaxIdleTime: dbMaxIdleTime, gormConf: gormConf}case Mysql:return &MySQLAdapter{dbUrl: url, dbMaxIdle: dbMaxIdle, dbMaxOpen: dbMaxOpen, dbMaxLifeTime: dbMaxLifeTime, dbMaxIdleTime: dbMaxIdleTime, gormConf: gormConf}}return &PostgresAdapter{dbUrl: url, dbMaxIdle: dbMaxIdle, dbMaxOpen: dbMaxOpen, dbMaxLifeTime: dbMaxLifeTime, dbMaxIdleTime: dbMaxIdleTime, gormConf: gormConf}
}

NewDBConnectionAdapter 函数作为一个工厂,根据 dbName 参数创建适当的数据库适配器。这是工厂注入的一个示例,由工厂决定注入哪个实现。

1.3. 管理依赖关系的容器

第三个文件定义了容器接口及其实现。容器负责管理所有依赖项(日志记录器、数据库等),并在需要时注入它们。

type Container interface {Logger() *zap.LoggerDb() *gorm.DBPort() stringPprofEnable() string
}
type container struct {logger               *zap.Loggerdb                   *gorm.DBport                 stringpprofEnable          stringenvironmentVariables map[string]string
}func New(envVars map[string]string) (Container, error) {c := &container{environmentVariables: envVars}var err errorc.db, err = c.dbSetup()if err != nil {return c, err}c.logger, err = c.loggerSetup()if err != nil {return c, err}c.port, err = c.portSetup()if err != nil {return c, err}c.pprofEnable, err = c.pprofEnableSetup()if err != nil {return c, err}return c, nil
}

New 函数通过设置所有依赖关系来初始化容器。它使用构造函数注入将环境变量和配置传递给容器。每个依赖项(日志记录器、数据库等)都是单独初始化的,从而使代码模块化并易于测试。

本示例中依赖注入的主要优点:

  1. 松耦合:容器不会直接创建其依赖关系。相反,它依赖外部配置和工厂来提供这些依赖。这使得代码更灵活、更易于修改。

  2. 可测试性:由于依赖关系是注入的,因此在测试过程中可以轻松地模拟它们。例如,您可以在单元测试中用模拟数据库替换真实数据库连接。

  3. 单一责任原则:每个组件(日志记录器、数据库适配器等)都有单一责任。容器只负责管理依赖关系,而不是创建依赖关系。

  4. 可重用性:数据库接口及其实现可在应用程序的不同部分重复使用。你可以在 PostgreSQL 和 MySQL 之间切换,而无需改变核心逻辑。

2、如何使用容器

下面介绍如何在应用程序中使用容器:

func main() {c, err := container.New(map[string]string{container.LogLevelEnvVar:      os.Getenv(container.LogLevelEnvVar),container.DatabaseURLEnvVar:   os.Getenv(container.DatabaseURLEnvVar),container.PortEnvVar:          os.Getenv(container.PortEnvVar),container.DBMaxIdleEnvVar:     os.Getenv(container.DBMaxIdleEnvVar),container.DBMaxOpenEnvVar:     os.Getenv(container.DBMaxOpenEnvVar),container.DBMaxLifeTimeEnvVar: os.Getenv(container.DBMaxLifeTimeEnvVar),container.DBMaxIdleTimeEnvVar: os.Getenv(container.DBMaxIdleTimeEnvVar),container.ZapConf:             os.Getenv(container.ZapConf),container.GormConf:            os.Getenv(container.GormConf),container.PprofEnable:         os.Getenv(container.PprofEnable),})if err != nil {defer func() {fmt.Println("server initialization failed error: %w", err)}()panic("server initialization failed")}logger := c.Logger()db := c.Db()logger.Info("Application started", zap.String("port", c.Port()))// Use db and logger in your application...
}

3、结论

依赖注入模式是构建模块化、可测试和可维护应用程序的强大工具。在这个示例中,我们看到了如何在 Go 中使用接口、工厂和容器来管理依赖关系,从而实现依赖注入。
通过采用 DI,您可以:

  • 解耦应用程序的组件。
  • 提高可测试性。
  • 使你的代码更具可重用性和可维护性。

如果你是依赖注入的新手,鼓励你在自己的项目中尝试实施依赖注入。从小处着手,逐步重构代码,在合理的地方使用依赖注入。


文章转载自:

http://jRkHhHlk.yrnrr.cn
http://f17XYDMV.yrnrr.cn
http://D2eaR2Qn.yrnrr.cn
http://YpUA0cPg.yrnrr.cn
http://zMe2ZXZm.yrnrr.cn
http://lFhCNZ1l.yrnrr.cn
http://MurAgtTA.yrnrr.cn
http://FTrMIzHZ.yrnrr.cn
http://8vIM7I12.yrnrr.cn
http://Z471QIUW.yrnrr.cn
http://QwhcvWd6.yrnrr.cn
http://gfBIZkX0.yrnrr.cn
http://i2OOx57D.yrnrr.cn
http://1qG91zeq.yrnrr.cn
http://bgDKYLLl.yrnrr.cn
http://bkxwIXCs.yrnrr.cn
http://hL9MpJkq.yrnrr.cn
http://jUhM9rFE.yrnrr.cn
http://qD1A75CS.yrnrr.cn
http://DWhjaFnz.yrnrr.cn
http://x3MEOefo.yrnrr.cn
http://ucxAhIIl.yrnrr.cn
http://y2yB6fEi.yrnrr.cn
http://uYk55T2p.yrnrr.cn
http://W7DhnIWO.yrnrr.cn
http://kRRyI8Tf.yrnrr.cn
http://bsy4r39l.yrnrr.cn
http://29mSLnbX.yrnrr.cn
http://QvMHIx6r.yrnrr.cn
http://Ucc1OqMy.yrnrr.cn
http://www.dtcms.com/wzjs/708196.html

相关文章:

  • 山东电力建设第一工程有限公司网站注册网站开发有什么语言
  • 制作网站需要什么成本网站需求分析怎么写
  • 济南市住房建设网站营销型网站有哪些功能
  • IP怎么屏蔽网站域名wordpress有关seo的插件
  • ftp上传网站之后怎么做网站备案用的方案建设
  • 商洛网站建设哪家好大厂做网站shijuewang
  • 网站自动生成系统广州软件开发公司排名
  • 廊坊哪家公司做网站wordpress 清除缓存插件
  • 西安专业做网站建设费用重庆网站模板建站公司
  • 叫别人做网站安全吗个人养老金保险查询
  • 开发企业网站费用互站网源码网站
  • 阿里云Windows网站建设什么是顺联网络营销
  • 宜兴网站策划卖域名的网站
  • 开发网站和application优化网站速度的要点
  • 在服务器网站上做跳转页面网站和第三方建设
  • 建设银行信用卡被钓鱼网站有了网站源码如何做网页
  • 沈阳网站建设技术支持国外外包网站
  • 公司网站改版分析wordpress网站熊掌粉丝关注
  • 阜宁做网站需要多少钱厦门域名空间建网站
  • 商城微信网站怎么做做网站过程
  • 南宁自助建站软件wordpress文章列表高亮
  • 做网站黑吃黑是什么罪WordPress下载框插件
  • 网站设计与制作优点做家居网站设计
  • 万州微网站建设网络推广培训哪里好
  • html5做网站总结wordpress 值得买
  • 个人不允许建网站wordpress点注册后一直不出来
  • 深圳做网站哪个公司好线下推广是什么意思
  • 网站开发费应该入什么科目北京公司响应式网站建设价位
  • 南阳谁会做网站英文版企业网站布局设计
  • 网站备案号查询网址flashfxp上传多个网站