当前位置:首页 >> 中医美容 >> 如何克服微咨询服务二分法

如何克服微咨询服务二分法

发布时间:2023-02-23

.Exec(ctx) return result, err}

让我们关注这段预定义的主要低成本:

这个明文提供者了一个初始化formula_,它不暴露浏览器本身,而是一个API。 这个浏览器提供者了一种加载咨询服务的单纯新方法,没有人人只能知道 API 的确实交但会点。才可适用这些新方法顺利进行 API 加载。

我们的客户准备好了。让我们在一个例子里适用它。

API 加载的无缝意味着

我们想适用侧面的英文翻译浏览器来英文翻译电子邮件内容。在咨询服务实际上的某个地方,我们将有一个好像像这样的处理程序。

func GenerateEmail(ctx context.Context, machine models.Machine, language string) ([]string, error) { emailContent, err := buildEmailContent(ctx, machine) if err != nil { return nil, err } translationClient, err := translations.InitClient(ctx) if err != nil { return nil, err } translatedEmailContent, err = translationClient.TranslateText(ctx, language, emailContent) if err != nil { return err } return translatedEmailContent, nil}

在单纯的生产预定义里,该buildEmailContent新方法就但会是私有的,并且但会被单元试验里隔开。这是一个标准化的例子。

我们不太可能意味着了我们的第一个目标。对另一个咨询服务的 API 加载是无缝的。没有人明确的 API 加载。没有人预定义块准备标题以在该公司演算里间加进提供者。预定义朴素朴素。另一个选读此预定义的合作API可以专注于演算。有了这个意味着,我们可以暂时通过扭转工具箱的旧版本来从 JSON 切换到 gRPC。

但是有一个不大的BUT。在此内置GenerateEmail里无法顺利进行单元试验里。适用英文翻译浏览器但会制止它。例如,Go 没有人提供者拦截新方法的工具。那么我们将如何应付这个原因呢?

为合作开发可避免咨询服务

我们将如何重写新方法以使其可试验里?单纯的技术细节是全都新方法实际上重新启动英文翻译浏览器。相反,该新方法只能接收它。

为什么我们关心我们在哪里初始化浏览器?这样我们就可以用实时浏览器替换浏览器。它将意味着并不相同的API,我们适用mockgen填充它。我们在运行生态环境里适用显然的英文翻译浏览器。单元试验里的实时浏览器。

最单纯的技术细节是将浏览器作为参数传达给新方法。这很容易,但很丑陋。这很丑,因为在复杂的咨询服务里,我们将有只能许多浏览器的流。在没有人注意到它的前提,我们开始将一堆浏览器传达给每个新方法。它准备变得混乱。

一个来得朴素的技术细节是适用字符串来传达浏览器。提到关于字符串的 golang 文档:“仅仅将字符串值可用传输某种程度和 API 的请求范围统计数据,而不可用将可选参数传达给formula_。”

通过字符串传达浏览器是一种可不感兴趣的约定。只能一个单纯的新方法将所有只能的浏览器另设到字符串里。API 加载将在里间件里适用此新方法。来自发布/串流队列的基于事件的流程将较强类似的意味着。我们只能确保它是我们新方法的先决条件。试验里时,我们将准备一个自订字符串,以及所需的实时浏览器。

为了意味着这一点,我们只能向我们的浏览器加进两个新方法。

const translationsClientKey = "translations"

func SetTranslationsClient(ctx context.Context, c Client) context.Context { return context.WithValue(ctx, translationsClientKey, c)}

func GetTranslationsClient(ctx context.Context) (Client, error) { _client := ctx.Value(translationsClientKey)

if client, ok := _client.(Client); ok { return client, nil } else { return nil, errors.New("client not in context") }}

您但会注意到 setter 和 getter 适用的是API而不是结构。这是因为我们的浏览器和我们的实时浏览器都意味着了并不相同的API。setter 和 getter 两者都接口。我们GenerateEmail将有一个重新意味着:

func GenerateEmail(ctx context.Context, machine models.Machine, language string) ([]string, error) { emailContent, err := buildEmailContent(ctx, machine) if err != nil { return nil, err } translationClient, err := translations.GetTranslationsClient(ctx) if err != nil { return nil, err } translatedEmailContent, err = translationClient.TranslateText(ctx, language, emailContent) if err != nil { return nil, err } return translatedEmailContent, nil}

现在我们的新方法准备适用它提供者的浏览器,我们可以对其顺利进行单元试验里。

令人难忘的单元试验里

重新意味着将必需这个单纯的单元试验里。

func TestEmptyEmailOnEmptyMachine(t *testing.T) { // creating a context from scratch ctx := context.Background() // initializing a mock controller and client mockCtrl := gomock.NewController(t) translationsClient := mockTranslations.NewMockClient(mockCtrl) // setting expectation and return values translationsClient.EXPECT().TranslateText(gomock.Any(), "en", []string{}).Return([]string{}, nil) // adding the mock client to the ctx ctx := translations.SetTransalationsClient(ctx, translationsClient) // testing that if the machine model is empty nothing is being generated emailContent, err := GenerateEmail(ctx, models.Machine{}, "en") assert.Nil(t, err) assert.Equal(t, 0, len(emailContent))}

我们不太可能实时了 API 加载,试验里可以在可避免生态环境里运行。适用此技术细节,我们可以在咨询服务里汇编复杂的演算并在几毫秒内对其顺利进行试验里。以这种方式为工作对平均速度有不大的冲击。

适用 API 嵌入,我们应付了微咨询服务的两个主要缺点。沟通很统一性。咨询服务可以可避免。在不危害我们的预定义或核心的前提。我们的咨询服务协同工作,而我们全然控制每一项咨询服务。

我们无论如何只能集成试验里来确保咨询服务里间的良好收发。我们不依赖它们来试验里我们咨询服务的实际上行为。

嵌入 API 只是六边形核心的一小部分。六边形核心必需我们汇编与基础设施分立的预定义。我们适用并不相同的演算顺利进行异步收发、统计数据库、多线程……

我们红豆了一些时间来微调咨询服务、浏览器和 go-api 里间的界限。其里一些原因仍在讨论里。不该在适用浏览器的咨询服务里还是在浏览器里定义实时鼓动?浏览器不该包括自己的存储库还是位于其咨询服务存储库里?我很乐意获得您自己的实施以及您如何应付此原因的一个系统。

广州看白癜风去哪个医院好
珠海看白癜风哪里好
石家庄男科医院哪家医院最好
艾得辛与来氟米特哪个治疗类风湿效果好
痛风发作吃英太青还是西乐葆
标签:
友情链接: 上海白癜风医院排名新冠特效药有哪些