前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Wire 最佳实践

Wire 最佳实践

作者头像
孟斯特
发布于 2023-10-16 11:41:06
发布于 2023-10-16 11:41:06
28900
代码可运行
举报
文章被收录于专栏:code人生code人生
运行总次数:0
代码可运行

原文在这里[1]

以下是我们推荐在使用 Wire 时应遵循的最佳实践。这个列表会随着时间的推移而增长。

区分类型

如果你需要注入一个常见类型,比如 string,请创建一个新的字符串类型,以避免与其他提供者产生冲突。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type MySQLConnectionString string

选项结构体

对于包含许多依赖项的提供者函数,可以与其配对一个选项结构体。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Options struct {
    // Messages is the set of recommended greetings.
    Messages []Message
    // Writer is the location to send greetings. nil goes to stdout.
    Writer io.Writer
}

func NewGreeter(ctx context.Context, opts *Options) (*Greeter, error) {
    // ...
}

var GreeterSet = wire.NewSet(wire.Struct(new(Options), "*"), NewGreeter)

库中的提供者集

当为在库中使用的提供者集时,你可以进行以下更改而不会破坏兼容性:

•更改提供者集使用的提供者来提供特定的输出,只要不引入新的提供者集输入。它可能会删除输入。但请注意,现有的注入器将继续使用旧的提供者,直到重新生成。•将新的输出类型引入到提供者集中,但只有在类型本身是新增的情况下才可以。如果类型不是新的,则有可能某些注入器已经包含了输出类型,这将导致冲突。

所有其他更改都是不安全的。包括:

•要求提供者集中增加新的输入。•从提供者集中删除输出类型。•将现有输出类型添加到提供者集中。

而不是进行上述任何破坏性更改,请考虑添加一个新的提供者集。

例如,如果你有一个如下所示的提供者集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var GreeterSet = wire.NewSet(NewStdoutGreeter)

func DefaultGreeter(ctx context.Context) *Greeter {
    // ...
}

func NewStdoutGreeter(ctx context.Context, msgs []Message) *Greeter {
    // ...
}

func NewGreeter(ctx context.Context, w io.Writer, msgs []Message) (*Greeter, error) {
    // ...
}

你可以:

•在 GreeterSet 中使用 DefaultGreeter 替代 NewStdoutGreeter。•创建一个新类型 T 并将提供者添加到 GreeterSet,只要 T 是在与提供者在同一次提交/发布中引入的即可。

你不能:

•在 GreeterSet 中使用 NewGreeter 替代 NewStdoutGreeter。这会同时添加一个输入类型(io.Writer),并要求注入器返回一个 error,而在提供者为 *Greeter 时不需要这样做。•从 GreeterSet 中删除 NewStdoutGreeter。依赖 *Greeter 的注入器将被破坏。•向 GreeterSet 添加一个 io.Writer 的提供者。注入器可能已经有一个提供者用于 io.Writer,这可能会与这个提供者冲突。

因此,在库中提供者集中,你应该仔细选择输出类型。一般来说,应该优先选择较小的库提供者集。例如,库提供者集通常只包含单个提供者函数以及 wire.Bind 来绑定返回类型实现的接口。避免使用较大的提供者集可以减少应用程序遇到冲突的可能性。举个例子,想象一下你的库提供了一个用于 web 服务的客户端。虽然可能会希望在库的客户端提供者集中捆绑一个 *http.Client 的提供者,但这样做会导致每个库都这样做时出现冲突。相反,库的提供者集应该只包含用于 API 客户端的提供者,并让 *http.Client 成为提供者集的输入。

模拟

有两种方法可以创建一个包含模拟依赖项的注入应用。这里展示了这两种方法的示例:

https://github.com/google/wire/tree/master/internal/wire/testdata/ExampleWithMocks/foo。

方法A:将模拟对象传递给注入器

创建一个仅用于测试的注入器,将所有模拟对象作为参数传递给它;参数类型必须是模拟的接口类型。由于 wire.Build 不能包含用于模拟依赖项的提供者,以避免冲突,因此如果你正在使用提供者集,你将需要定义一个不包含模拟类型的提供者集。

方法B:从注入器返回模拟对象

创建一个新的结构体,其中包含应用程序以及你想要模拟的所有依赖项。创建一个仅用于测试的注入器,返回这个结构体,并为具体的模拟类型提供者,使用 wire.Bind 来告诉 Wire 这些具体的模拟类型应该用于满足相应的接口。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[2]进行许可,使用时请注明出处。 Author: mengbin[3] blog: mengbin[4] Github: mengbin92[5] cnblogs: 恋水无意[6]

References

[1] 这里: https://github.com/google/wire/blob/main/docs/best-practices.md [2] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [3] mengbin: mengbin1992@outlook.com [4] mengbin: https://mengbin.top [5] mengbin92: https://mengbin92.github.io/ [6] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孟斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装
前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装。 Dapper的用法比较接近ADO.NET所以性能也是比较快。所以我们先来看看使用ADO.NET的时候我们怎么实现代码复用的封装。 ◆ 一、ADO.NET的封装案例 利用反射对ADO.NET进行封装,看代码: DBHelper.cs:这边用的是mysql,如果要用sqlserver将MySqlConnection换成SqlConnection即可。 这个写的比较简单,如果有复杂的sql可能就支
IT大咖说
2022/03/14
3K0
LINQ to SQL 使用指南
LINQ to SQL 是 Microsoft 提供的一种用于 .NET Framework 的对象关系映射器(ORM),它允许开发人员使用 LINQ 查询语法来操作数据库中的数据,而无需直接编写 SQL 语句。这使得数据操作变得更加简单和直观。本文将从基础概念入手,逐步深入介绍 LINQ to SQL 的使用方法,并探讨一些常见的问题及其解决策略。
Jimaks
2024/10/09
3720
Linq基础知识小记三
1、子查询 Linq中的子查询思想和Sql中的子查询其实差不多, 对于方法语法,一个子查询包含在另一个子查询的Lambda表达式中,代码如下: string[] names = { "James", "Kobe", "Curry", "Durrent" }; IEnumerable<string> result = names.OrderBy(n => n.Split().Last()); n.Split().Last()就是一个子查询 下面通过一个例子来讲解Linq子查询的两种不同的方式.找出一个IEnu
郑小超.
2018/01/26
9490
一步一步学Linq to sql(九):其它补充
5、现在就可以照常进行其它工作了。使用sqlmetal可以很方便的同步数据库与实体和映射文件。每次修改数据库结构,从dbml设计器上删除表、存储过程然后再重新添加也是很麻烦的事情。
aehyok
2018/09/11
3220
一步一步学Linq to sql(九):其它补充
LINQ to SQL(3):增删改查
上一节中,我已经写过了利用OR设计器生成对象模型的方式,其实生成这样对数据库进行映射的模型的方式不只这一种,不过VS为我们提供的这种设计器真的是很强大,在实际应用中也是经常用到的 这一节写利用LINQ to SQL对数据库进行的简单增删改查的操作的实现方式,这里注意是“简单”,复杂的查询呢,我将会在下一篇或者下下一篇中写到,那里会有很多的内容,比如处理并发啦,自定义LINQ表达式查询啦,等等的这些,而下一篇中我计划写一些关于扩展OR设计器生成的代码以及向实体类中添加验证的一些东西,因为毕竟我们使用OR设计器
小白哥哥
2018/03/07
7350
LINQ to SQL(3):增删改查
LINQ能不能用系列(二)LINQ to SQL 效率比对
前言 很多人听说过LINQ TO SQL与ADO.NET传统方式用于不同的环境,LINQ TO SQL与ADO.NET传统方式也没有可比性,就像公交车与私家车一样,虽然是车但用途完全不同,但很少有人去探究,究竟为什么他们不同,他们不同的原因是什么,这我觉得是一个好的程序和一个普通程序最主要的区别之一。下面一起来看LINQ TO SQL效率到底如果吧。 内容 测试环境:net framework 4.0 + Sql Server 2008 测试用途:100w条数据 like 查询,原因添加、修改、删除消耗
磊哥
2018/05/08
1.2K0
LINQ能不能用系列(二)LINQ to SQL 效率比对
一步一步学Linq to sql(八):继承与关系
1.首先定义的是Topic实体基类,然后两个子类的继承,NewTopic--主题帖,Reply--回复帖。 2.Topic类上的特性,下面先来看一下特性类
aehyok
2018/09/11
3880
一步一步学Linq to sql(八):继承与关系
Linq:基本语法form ,select, where(2)
一:基础知识 1:linq查询表达式必须以from子句开头 2:linq查询表达式必须以select 或者group子句结尾 3:linq查询表达式可以包含0个或多个where子句,一个where子句可以包含1个或多个布尔条件表单时
liulun
2022/05/09
8330
【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构
  随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长。特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案不够健壮,那么数据库服务器很有可能在高并发访问负载压力下宕机,造成数据访问服务的失效,从而导致网站的业务中断,给公司和用户造成双重损失。那么,有木有一种方案能够解决此问题,使得数据库不再因为负载压力过高而成为网站的瓶颈呢?答案肯定是有的。
Edison Zhou
2018/08/20
5260
【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构
C#实战:LighthouseDB轻量数据库服务介绍和案例实践
LighthouseDB轻量数据库服务基于腾讯云自研的新一代云原生数据库 TDSQL-C,融合了传统数据库、云计算与新硬件技术的优势,100%兼容 MySQL,实现超百万级 QPS 的高吞吐,128TB 海量分布式智能存储,保障数据安全可靠。
小明互联网技术分享社区
2024/04/15
4980
C#实战:LighthouseDB轻量数据库服务介绍和案例实践
LINQ to SQL(1):基础入门
LINQ to SQL是在SQL SERVER数据库上设置一个强类型化界面的方式,LINQ to SQL提供的方式是目前我所见到查询SQL SERVER最简单也是最有效的方式,他可以使用自定义的类型与数据表甚至存储过程进行对应,而不像我们使用ADO.NET那样,把更多的功夫用在数据类型转换等等的问题上,当程序运行的时候,LINQ to SQL会将我们使用自己的语言定义的模型中的语言继承查询转换为SQL,然后将他在数据库上执行,然后将返回的结果转换为我们自定义的类对象,使用过nhibernate或者ibati
小白哥哥
2018/03/07
1.4K0
LINQ to SQL(1):基础入门
EntityFramework数据持久化复习资料5、LINQ概述与应用(超终点)
        本地数据库链接:【.】或【127.0.0.1】         登陆方式1:【本地登陆】         登陆方式2:账号【sa】 pwd【admin】         测试数据库名称:【mytest】         排序规则:【Chinese_PRC_CI_AS】
红目香薰
2023/02/27
2.2K0
EntityFramework数据持久化复习资料5、LINQ概述与应用(超终点)
轻量级ORM框架初探-Dapper与PetaPoco的基本使用
  EF是传统的ORM框架,也是一个比较重量级的ORM框架。这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择。
Edison Zhou
2018/08/20
1.8K0
轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一步一步学Linq to sql(七):并发与事务
为了看起来清晰,我已经事先把所有分类为1产品库存修改为相同值了。然后执行下面的程序:
aehyok
2018/09/11
5690
一步一步学Linq to sql(七):并发与事务
C# 学习笔记(14)—— LINQ
LINQ 是 Lanuage Integrated Query 的缩写,即“语言集成查询”的意思。众所周知,做软件开发离不开数据的,你肯定听过SQL数据库、Oracle数据库或本地XML文档等。每种数据源都有自己的查询语言,例如SQL数据库有自己的SQL语言,。LINQ的提出就是为了提供一种跨越各种数据源的统一的查询方式,它主要包括四个组件——Linq to Objects、Linq to XML、Linq to DataSet 和 Linq to SQL
Karl Du
2023/10/20
2980
一步一步学Linq to sql(二):DataContext与实体
 DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。
aehyok
2018/09/11
8630
一步一步学Linq to sql(二):DataContext与实体
c# LINQ查询方法(1)
Language Integrated Query 语言集成查询 可以使得查询操作通过编程语言自身来表示,而不是嵌入字符串SQL语句。
MaybeHC
2024/04/23
1290
c# LINQ查询方法(1)
【C# 基础精讲】LINQ 基础
LINQ(Language Integrated Query)是一项强大的C#语言特性,它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ,您可以使用类似SQL的语法来查询各种数据源,如集合、数组、数据库等。本文将介绍LINQ的基础概念、常见的LINQ操作和示例,以及如何在C#中利用LINQ进行数据查询和处理。
繁依Fanyi
2023/10/12
3800
【C# 基础精讲】LINQ 基础
使用VS2015和Nhibernate实现与MySql数据库连接,实现增删改查操作
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/03
1.5K0
一步一步学Linq to sql(十):多层架构MVC WCF Linq
 A,MVC网站项目 MvcOperation:留言簿表现层  B,类库项目 Contract:定义数据访问服务的契约  C,类库项目 Service:定义数据访问服务  D,类库项目Entity:留言簿实体  E,控制台项目Host:承载数据访问服务
aehyok
2018/09/11
5380
一步一步学Linq to sql(十):多层架构MVC WCF Linq
推荐阅读
相关推荐
Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档